【问题标题】:parsing error invoking static function on object instance?在对象实例上调用静态函数时解析错误?
【发布时间】:2013-09-06 18:42:27
【问题描述】:

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

foo().Bar<int>();

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’

【问题讨论】:

  • 你得到什么编译错误?
  • 我编辑了帖子以包含 gcc 的错误输出。

标签: c++ templates static-methods


【解决方案1】:

正确的语法是:

foo().template Bar<int>();

【讨论】:

  • 谢谢!我以前没有遇到过这种语法。如果有人感兴趣,我在使用Lightweight Generic C++ Callbacks 时遇到了这个问题(在更复杂的代码中)。
【解决方案2】:

(添加到@Dieter 答案)

否则你必须使用临时:

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

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

【讨论】:

  • 这确实修复了示例代码(我测试过)。但是,不可能在出现问题的原始(更复杂的代码)中执行此操作。谢谢。
猜你喜欢
  • 2014-09-29
  • 2010-10-16
  • 2018-03-04
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
  • 2017-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多