0

我想知道以下代码是否应该被认为是有效的 c++、gcc 和 clang 都扼杀了它,而我们的项目使用的 Microsoft 和嵌入式编译器(青山)似乎可以毫无问题地解析它。这行代码给 gcc 和 clang 带来了麻烦:

foo().Bar<int>();

gcc 似乎认为 < 是小于运算符,而不是指定模板参数。如果 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’
4

2 回答 2

1

正确的语法是:

foo().template Bar<int>();
于 2013-09-06T18:56:01.577 回答
0

(添加到@Dieter 答案)

否则你必须使用一个临时的:

  Test1 tt = foo();
  tt.Bar<int>();

(在这种情况下,您可以简单地使用t而不是tt,但这当然不是重点)。

于 2013-09-06T19:03:12.787 回答