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

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; 
}
Run Code Online (Sandbox Code Playgroud)

Microsoft Visual Studio Express 2013 for Windows桌面版本12.0.31101.00 Update 4中运行此操作会出现以下错误:

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

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

错误C2833:'operator>'不是可识别的运算符或类型

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

有没有办法改写这个,以便它被认为是有效的?

tux*_*ux3 3

只需添加括号&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; 
}
Run Code Online (Sandbox Code Playgroud)

添加括号的“技巧”在许多表达式不明确或被编译器误解的情况下都有效。