2015-06-14 7 views
5

Wenn ich die Adresse eines Rechtsverschiebungsoperators nehme und sie als Vorlageparameter übergebe, wird das rechte Verschiebungssymbol als Ende der Vorlagenparameterliste falsch gelesen, und Die daraus resultierende Verwirrung verursacht mehrere Fehler.Syntaxfehler, wenn der Rechtsverschiebungsoperator als Vorlagenparameter verwendet wird

template <class T, void(T::*)(int)> struct TemplateMagic {}; 
struct TestStruct { void operator>> (int) {} }; 

int main() { 
//All the errors are on this line: 
    TemplateMagic<TestStruct, &TestStruct::operator>> >* ptr; 
} 

Ausführen dieses in Microsoft Visual Studio Express 2013 für Windows Desktop Version 12.0.31101.00 Update 4 gibt die folgenden Fehler:

Fehler C2143: Syntaxfehler: fehlen; vor '>'

Fehler C2275: 'TestStruct': illegale Verwendung dieser Art als Ausdruck

Fehler C2833: 'Operator>' ist kein Operator erkannt oder

Was geben Sie als Ich kann sagen, die operator>> > Symbole sind auseinander gebrochen, so dass es liest es als operator>10, gefolgt von einem Abschluss >, um die Vorlage Argumente zu schließen, und endet mit einem Ersatz > für die Lulz. Ich nehme an, das ist ein Fehler.

Gibt es eine Möglichkeit, dies umzuschreiben, damit es als gültig erkannt wird?

+0

Haben Sie versucht, es in Klammern zu setzen: 'TemplateMagic >)> * ptr;'? –

Antwort

3

Durch einfaches Hinzufügen von Klammern um &TestStruct::operator>> wird MSVC gezwungen, es korrekt zu analysieren.

Dieser Code kompiliert with MSVC 19.00.23008.0:

template <class T, void(T::*)(int)> struct TemplateMagic {}; 
struct TestStruct { void operator>> (int) {} }; 

int main() { 
    TemplateMagic<TestStruct, (&TestStruct::operator>>) >* ptr; 
} 

Der „Trick“ Klammern hinzuzufügen wird in vielen Situationen zu arbeiten, wo ein Ausdruck vom Compiler nicht eindeutig oder falsch verstanden wird.

Verwandte Themen