2015-06-14 11 views
5

Jeśli przyjmę adres operatora prawego przejścia i przekazuję go jako parametr szablonu, prawy symbol przesunięcia jest błędnie odczytywany jako koniec listy parametrów szablonu, oraz wynikłe zamieszanie powoduje wiele błędów.Błędy składni, gdy operator prawego przesunięcia jest używany jako parametr szablonu

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; 
} 

Running to w Microsoft Visual Studio Express 2013 for Windows pulpitu Wersja 12.0.31101.00 Update 4 daje następujące błędy:

error C2143: syntax error: brakuje ';' przed '>'

błędu C2275: 'TestStruct': nielegalne korzystanie z tego typu jako wyraz

error C2833: 'operatora>' nie jest uznanym operatorem lub wpisz

miarę Mogę powiedzieć, że symbole operator>> > są rozdzielane, więc czyta się je jako operator>, a następnie kończą się >, aby zamknąć argumenty szablonu, a kończą na zapasowym > dla lulzu. Zakładam, że to błąd.

Czy istnieje sposób na przeformułowanie tego, aby zostało uznane za ważne?

+0

Czy próbowałeś umieścić to w nawiasach: 'TemplateMagic >)> * ptr;'? –

Odpowiedz

3

Po prostu dodanie nawiasów wokół &TestStruct::operator>> zmusi MSVC do prawidłowego przeanalizowania.

Ten kod kompiluje 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; 
} 

W „trick” z dodanie nawiasów będzie działać w wielu sytuacjach, w których wyrazem jest niejednoznaczny lub niezrozumiany przez kompilator.

Powiązane problemy