-Wconversion is a Bitch! Battlefield 4.. ääh Bitfield:4!
Verfasst: 14.09.2016, 12:42
Hallo Leute,
Wiedereinmal ein tolles C++-Problem mit Templates!
Und zwar geht es um das Zuweisen von Bitfield-Members.
Beispiel-Bitfeld:Der GCC wirft hier:
Es hilft nicht:
Nun habe ich mir ein Hilfstemplate geschrieben:
Damit kann ich jetzt schreiben:
Und alles ist in Butter, weil Value die gleiche Bitanzahl hat usw.
Nun die große Frage!
Wieso kann der Compiler den Typ T nicht deduzieren(, deducten, deductziieren.. whatever).
Es ist mMn klar, dass der Konstruktor von NBitValue<4>(MegaZahl) mit dem Typ T=unsigned int aufgerufen wird.
Dennoch werde ich gezwungen den Typen immer hinzuschreiben...
Wieso?
Ich hätte gern einfach nur:
Und falls noch jemand weiß, wie man auf das .Value verzichten kann.. immer raus damit!
:-)
Wiedereinmal ein tolles C++-Problem mit Templates!
Und zwar geht es um das Zuweisen von Bitfield-Members.
Beispiel-Bitfeld:
Code: Alles auswählen
struct SBitfield
{
unsigned int a : 4;
unsigned int b : 4;
unsigned int : 24;
};
static_assert(sizeof(SBitfield) == 4 ,"Heidewitzka!");
unsigned int MegaZahl = 5;
//...
SBitfield Bitfield;
Bitfield.a = MegaZahl; // <---- [-Wconversion]
(void)Bitfield.a;
Ok.conversion to 'unsigned char:4' from 'unsigned int' may alter its value [-Wconversion]
Es hilft nicht:
Code: Alles auswählen
unsigned int MegaZahl:4 = 5; //Geht nicht O_o
unsigned char MegaZahl = 5; //Selbe Fehlermeldung.. (ja, mit 'unsigned int')
Code: Alles auswählen
template<unsigned int N, typename T> union NBitValue
{
static_assert((sizeof(T)*8) > N, "Komische Bitanzahl");
private:
const T Data;
public:
struct
{
const T Value : N;
const T : (sizeof(T)*8-N);
};
NBitValue(const T& _Data): Data(_Data) {}
};
Code: Alles auswählen
Bitfield.b = NBitValue<4, unsigned int>(MegaZahl).Value;
Nun die große Frage!
Wieso kann der Compiler den Typ T nicht deduzieren(, deducten, deductziieren.. whatever).
Es ist mMn klar, dass der Konstruktor von NBitValue<4>(MegaZahl) mit dem Typ T=unsigned int aufgerufen wird.
Dennoch werde ich gezwungen den Typen immer hinzuschreiben...
Wieso?
Ich hätte gern einfach nur:
Code: Alles auswählen
Bitfield.b = NBitValue<4>(MegaZahl).Value;
:-)