正向声明的类型和“已经声明为类类型的非类类型”

时间:2011-05-13 17:45:58

标签: c++ templates visual-c++

我遇到以下代码问题:

  template <typename T>
  void foo(struct bar & b);
  struct bar {};
  int main(){}

它在GCC上成功编译,但在MSVC(2008)上失败并出现以下错误:

C2990: 'bar' : non-class type as already been declared as a class type

代码是错误还是MSVC中的错误?

如果我在模板定义之前添加struct bar;,它就有效。

5 个答案:

答案 0 :(得分:3)

在大多数情况下,C(或C ++编译器)在源代码上严格按照从上到下的方式工作。因此,在尝试引用struct bar之前需要forward declaration,否则编译器将不知道它存在。

答案 1 :(得分:3)

我们有胜利者:

https://connect.microsoft.com/VisualStudio/feedback/details/668430/forward-declared-type-and-non-class-type-as-already-been-declared-as-a-class-type

  

感谢您报告此问题。   这确实是一个例子   VC ++中的不符合行为。   但是,一个简单的解决方法是   重新排序声明,以便   声明“结构栏”是众所周知的   模板声明是   遇到。由于严重程度低   这个错误和我们的优先事项,我们   很遗憾我们无法解决这个问题   下一个版本的编译器但是   我们会考虑将来   释放。

     

此致

     

Tanveer Gani   Visual C ++团队

答案 2 :(得分:1)

答案 3 :(得分:0)

您很可能在此代码块之上的某处(可能在头文件中)struct bar {};。见http://msdn.microsoft.com/en-us/library/zfcw8kk9.aspx

修改:也可以从上面的链接中获取:

  

C2990也可能因断裂而发生   在Visual C ++编译器中进行更改   Visual C ++ 2005;编译器现在   需要多个声明   相同类型的相同   尊重模板规范。

由于foo是模板化的barfoo参数列表中的“前向声明”,如果您将struct bar {};移到foo之上,会发生什么? ?

答案 4 :(得分:0)

这看起来像是有效的代码。无论MSVC做什么,从我所看到的,它似乎是一些奇怪的不合规行为。

相关问题