Ich mache eine Klasse für variable Bitgröße Pixel Farbwerte. Wie auch immer, ich habe es funktioniert, aber es ist etwas Merkwürdiges:Warum kann dieses Programm nicht kompiliert werden, wenn der Fehler nicht erreichbar ist?
#pragma pack(push, 1)
template <typename my_type>
struct c {
my_type x;
c() {}
c(my_type x) { this->x = x; }
template<typename target_type>
c<target_type> convert() {
if (std::is_same<my_type, target_type>::value) {
return *this; //<- doesn't work
return *reinterpret_cast<c<target_type>*>(this); //<- does work
}
int target_size = sizeof(((c<target_type>*)0)->x);
int my_size = sizeof(x);
if (my_size < target_size) {
return c<target_type>(x << (target_size - my_size) * 8);
}
my_type rounder = ((x >> (my_size - target_size) * 8 - 1) & 9) > 4;
return c<target_type>((x >> (my_size - target_size) * 8) + rounder);
}
};
#pragma pack(pop)
auf der Linie I gekennzeichnet sind, sollte ich in der Lage sein, nur zurückkehren * dies aber wenn ich das tun und versuchen, mit dem folgenden Test zu kompilieren:
c<uint8_t> a;
c<uint32_t> b(2147483647);
a = b.convert<uint8_t>();
dann erhalte ich die Fehler
cannot convert from c<uint32_t> to c<uint8_t>
was keinen Sinn macht, weil es nicht soll nichts, wenn seine vom gleichen Typ konvertieren, die mit uint32_t
-nicht der Fall ist
Dies ist auf MSVC, weiß jemand, warum das passiert?
'kann nicht von c zu c ' Nun, können Sie nicht, was ist eigentlich unklar? –
Haben Sie wirklich zwei Returns hintereinander in Ihrer 'if' Anweisung oder ist das ein armer Kommentar? – erip
@ πάνταῥεῖ das Szenario kann nie passieren – user81993