我想知道下面的代码是否应该被认为是有效的c ++,gcc和clang都会扼杀它,而Microsoft和我们项目使用的嵌入式编译器(绿色山丘)似乎没有问题地解析它。这行代码给gcc和clang带来麻烦:
foo().Bar<int>();
看来gcc认为&lt;是一个小于运算符而不是指定模板参数。如果Bar被更改为不是模板函数,gcc会接受它。
class Test1
{
public:
template<typename U>
static void Bar() {}
};
template<typename T>
class Test2
{
public:
Test2()
{
foo().Bar<int>();
}
Test1 foo() { return t; }
Test1 t;
};
int main()
{
Test2<int> t;
}
从我的研究中调用对象实例上的静态成员函数是有效的c ++。那么你有什么想法?这是gcc的错误:
Error.cpp: In constructor ‘Test2<T>::Test2()’:
Error.cpp:14:17: error: expected primary-expression before ‘int’
foo().Bar<int>();
^
Error.cpp:14:17: error: expected ‘;’ before ‘int’
答案 0 :(得分:1)
正确的语法是:
foo().template Bar<int>();
答案 1 :(得分:0)
(添加到@Dieter答案)
否则你必须使用临时的:
Test1 tt = foo();
tt.Bar<int>();
(在这种情况下,您可以简单地使用t
代替tt
,但当然这不是重点。