【问题标题】:Forward-declared type and "non-class type as already been declared as a class type"前向声明的类型和“已声明为类类型的非类类型”
【发布时间】:2011-08-25 03:27:35
【问题描述】:

我对以下代码有疑问:

  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; 就可以了。

【问题讨论】:

  • VC++ 2010 也失败了。天哪,用于 C++ 开发 VS 的 IDE 变得多么糟糕!

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


【解决方案1】:

我们有我们的赢家:

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”何时知道 模板声明是 遭遇。由于严重程度低 这个错误和我们的优先事项,我们 很遗憾我们无法修复 编译器的下一个版本,但是 我们会考虑它的未来 释放。

问候,

坦维尔·加尼 Visual C++ 团队

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 您可以进行内联前向声明。喜欢void foo(struct bar &amp; b);。这里的 struct 关键字是前向声明。
    • @你好:真的吗?我不是说你错了,只是我以前从未见过这种情况。可以提供参考吗?
    • @Oli:不用模板试试,它会编译。 :)
    • @Oli 没有参考标准,但例如 Boost.Exception 使用它为boost::error_info&lt;struct this_is_a_tag, T&gt;boost.org/doc/libs/1_46_1/libs/exception/doc/error_info.html动态创建(标记)类型
    • @Oli:检查此代码:ideone.com/hlPN0。在函数声明中 bar 之前没有“struct”,我们得到 ‘bar’ is not declared in this scope 错误。
    【解决方案3】:
    【解决方案4】:

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

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

    C2990 也可能由于断裂而发生 Visual C++ 编译器中的更改 视觉 C++ 2005;现在的编译器 需要多个声明 对于相同的类型是相同的 关于模板规范。

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

    【讨论】:

    • @Hello 根据您的评论编辑。
    • 回复您的编辑:是的,它会工作。另外,如果我添加 struct bar,它会起作用;在模板定义之前。就像我在我的问题中写的那样。
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-12
      • 1970-01-01
      • 1970-01-01
      • 2015-03-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      相关资源
      最近更新 更多