右移运算符用作模板参数时的语法错误

时间:2015-06-14 10:57:41

标签: c++ templates syntax-error

如果我取右移位运算符的地址并将其作为模板参数传递,则右移位符号被误读为模板参数列表的末尾,由此产生的混淆导致多个错误。

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

Microsoft Visual Studio Express 2013 for Windows Desktop中运行此功能 版本12.0.31101.00更新4 给出以下错误:

  

错误C2143:语法错误:缺少';'在'&gt;'之前

     

错误C2275:'TestStruct':非法使用此类型作为表达式

     

错误C2833:'运营商&gt;'不是公认的运营商或类型

据我所知,operator>> >符号被拆分,因此它将其读作operator>,然后是终止>以关闭模板参数,并以lulz的备用>。我认为这是一个错误。

有没有办法改写这个以便它被识别为有效?

1 个答案:

答案 0 :(得分:3)

只需在mv .AndroidStudio .AndroidStudio.bak mv .AndroidStudio1.1 .AndroidStudio1.1.bak mv .AndroidStudio1.2 .AndroidStudio1.2.bak 周围添加括号,就会强制MSVC正确解析它。

此代码编译with MSVC 19.00.23008.0

&TestStruct::operator>>

添加括号的“技巧”将适用于编译器表达模糊或误解的许多情况。