繁体   English   中英

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

[英]Forward-declared type and “non-class type as already been declared as a class type”

我有以下代码的问题:

  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;它可以工作struct bar; 在模板定义之前。

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

我们有赢家:

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

感谢您报告此问题。 这确实是VC ++中不符合行为的情况。 但是,一个简单的解决方法是重新排序声明,以便在遇到模板声明时知道声明“struct bar”。 由于此错误的严重性较低以及我们的优先级,我们很遗憾我们无法在下一版本的编译器中修复该错误,但我们会考虑将其用于将来的版本。

问候,

Tanveer Gani Visual C ++团队

你很可能有struct bar {}; 在这个代码块之上的某个地方(可能在头文件中)。 请参阅http://msdn.microsoft.com/en-us/library/zfcw8kk9.aspx

编辑:同样来自上面的链接:

C2990也可能由于Visual C ++ 2005的Visual C ++编译器发生重大变化而发生; 编译器现在要求相同类型的多个声明在模板规范方面是相同的。

由于foo是模板化的,并且barfoo参数列表中被“前向声明”,因此如果移动struct bar {};会发生什么struct bar {}; 以上foo

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM