我遇到以下代码问题:
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;
,它就有效。
答案 0 :(得分:3)
在大多数情况下,C(或C ++编译器)在源代码上严格按照从上到下的方式工作。因此,在尝试引用struct bar
之前需要forward declaration,否则编译器将不知道它存在。
答案 1 :(得分:3)
我们有胜利者:
感谢您报告此问题。 这确实是一个例子 VC ++中的不符合行为。 但是,一个简单的解决方法是 重新排序声明,以便 声明“结构栏”是众所周知的 模板声明是 遇到。由于严重程度低 这个错误和我们的优先事项,我们 很遗憾我们无法解决这个问题 下一个版本的编译器但是 我们会考虑将来 释放。
此致
Tanveer Gani Visual C ++团队
答案 2 :(得分:1)
无论如何,我在Microsoft Connect中发布了一个错误:https://connect.microsoft.com/VisualStudio/feedback/details/668430/forward-declared-type-and-non-class-type-as-already-been-declared-as-a-class-type
答案 3 :(得分:0)
您很可能在此代码块之上的某处(可能在头文件中)struct bar {};
。见http://msdn.microsoft.com/en-us/library/zfcw8kk9.aspx
修改:也可以从上面的链接中获取:
C2990也可能因断裂而发生 在Visual C ++编译器中进行更改 Visual C ++ 2005;编译器现在 需要多个声明 相同类型的相同 尊重模板规范。
由于foo
是模板化的bar
是foo
参数列表中的“前向声明”,如果您将struct bar {};
移到foo
之上,会发生什么? ?
答案 4 :(得分:0)
这看起来像是有效的代码。无论MSVC做什么,从我所看到的,它似乎是一些奇怪的不合规行为。