如果我使用右移运算符的地址并将其作为模板参数传递,则右移符号将被误读为模板参数列表的末尾,并且由此引起的困惑会导致多个错误。
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;
}
在适用于Windows桌面的Microsoft Visual Studio Express 2013中运行此程序版本12.0.31101.00更新4给出以下错误:
据我所知,
operator>> >
符号被分解,因此将其读取为operator>
,然后是终止的>
以关闭模板参数,最后以lulz的备用>
结尾。我认为这是一个错误。有什么办法可以改写它,使它被识别为有效吗?
最佳答案
只需在&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;
}
添加括号的“技巧”将在许多情况下起作用,在这种情况下,表达式可能会被编译器弄糊涂或被误解。
关于c++ - 将右移运算符用作模板参数时的语法错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30828536/