2015-06-14 33 views
5

如果我將右移運算符的地址作爲模板參數傳遞,則右移符號將被誤讀爲模板參數列表的末尾,由此產生的混亂造成了多重錯誤。將右移運算符用作模板參數時的語法錯誤

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

微軟的Visual Studio Express的2013運行此爲Windows桌面版本 更新12.0.31101.00 4給出了以下錯誤:

錯誤C2143:語法錯誤:缺少 ';'之前「>」

錯誤C2275:「TestStruct」:非法使用這種類型的作爲表達

錯誤C2833:「運算>」不是可識別的操作者或鍵入

至於我可以告訴,operator>> >符號正在分解,因此它將其讀取爲operator>,然後終止>關閉模板參數,並以lulz的備用>結束。我認爲這是一個錯誤。

有沒有任何方法可以對此進行改寫,使其被識別爲有效?

+0

你試過把它放在圓括號裏:'TemplateMagic >)> * ptr;'? –

回答

3

簡單地在&TestStruct::operator>>左右加上括號會強制MSVC正確解析它。

此代碼編譯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; 
} 

加法括號將在許多情況下工作,其中的表達是不明確的或由編譯器誤解的「特技」。