如果我取右移位运算符的地址并将其作为模板参数传递,则右移位符号被误读为模板参数列表的末尾,由此产生的混淆导致多个错误。
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的备用>
。我认为这是一个错误。
有没有办法改写这个以便它被识别为有效?
答案 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>>
添加括号的“技巧”将适用于编译器表达模糊或误解的许多情况。