Wea*_*ish 5 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桌面版本12.0.31101.00 Update 4中运行此操作会出现以下错误:
错误C2143:语法错误:缺少';' 在'>'之前
错误C2275:'TestStruct':非法使用此类型作为表达式
错误C2833:'operator>'不是可识别的运算符或类型
据我所知,operator>> >符号被分开,因此它将其读作operator>,然后是终止>以关闭模板参数,并以>lulz 的备用结束.我认为这是一个错误.
有没有办法改写这个,以便它被认为是有效的?
只需添加括号&TestStruct::operator>>即可强制 MSVC 正确解析它。
此代码使用 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; 
}
添加括号的“技巧”在许多表达式不明确或被编译器误解的情况下都有效。