2015-06-14 8 views
5

Se si prende l'indirizzo di un operatore di spostamento a destra e lo si passa come parametro di modello, il simbolo di spostamento a destra non viene letto come la fine dell'elenco dei parametri del modello e la confusione risultante sta causando più errori.Errori di sintassi quando l'operatore di spostamento a destra viene utilizzato come parametro modello

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

L'esecuzione di questo in Microsoft Visual Studio Express 2013 per Windows Desktop versione 12.0.31101.00 Update 4 dà i seguenti errori:

errore C2143: errore di sintassi: manca ';' prima '>'

errore C2275: 'TestStruct': uso illegale di questo tipo come espressione

errore C2833: 'operatore>' non è un operatore o digitare

Per quanto riconosciuto Posso dire, i simboli operator>> > vengono suddivisi in modo da leggerlo come operator>, seguito da un > terminante per chiudere gli argomenti del modello e termina con un > di riserva per il lulz. Presumo che questo sia un bug.

C'è un modo per riformulare questo in modo che venga riconosciuto come valido?

+0

Hai provato a metterlo tra parentesi: 'TemplateMagic >)> * ptr;'? –

risposta

3

Semplicemente aggiungendo le parentesi intorno a &TestStruct::operator>> si imporrà MSVC per analizzarlo correttamente.

Questo codice viene compilato 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; 
} 

Il "trucco" di aggiunta parentesi funzionerà in molte situazioni in cui l'espressione è ambigua o fraintesi dal compilatore.

Problemi correlati