Visual Studio 2010 Express无法使用交叉引用编译代码

时间:2015-07-14 12:10:52

标签: c++ visual-studio-2010 cross-reference

GCC可以编译下面的代码,但VS2010表示不能:

#include <iostream>
#include <queue>
using namespace std;

struct A
{
  deque<A>::iterator next;
};
int main()
{
  A a;
}

错误讯息:

  

错误C2027:使用未定义的类型&#39; A&#39; main.cpp(6):见&#39; A&#39; main.cpp(7):参见类模板实例化&#39; std :: deque&lt; _Ty&gt;&#39;正在编译1&gt;用1> [1> _Ty = A 1&gt; ]

有没有办法解决这个问题,除了使用指针?

1 个答案:

答案 0 :(得分:1)

正如在How come I can use a forward-declared class in a std::vector?中所讨论的那样,实例化具有不完整类型的标准容器是未定义的行为。为了能够访问迭代器类型std::deque<A>,需要实例化此类,因此您提供的程序具有未定义的行为。在这个特定的实例中,在gcc中,未定义的行为恰好是您所期望的,而Visual Studio(带有Dinkumware标准库实现)恰好无法编译。 Visual Studio可能在调试和发布模式下表现不同,因为在调试模式下,容器(和迭代器)要复杂得多,以便能够检查许多迭代器滥用情况。

我无法快速找到一个引用声明指向deque迭代器的引用,其中元素类型是一个不完整的类型是允许的,我担心很可能用指向迭代器的指针替换迭代器不会使这个程序定义(尽管它可能使其在更多环境中工作)。如果你用指针替换迭代器:这肯定会起作用。我无法告诉您它是否是唯一的解决方案,因为您没有明确说明您尝试解决的问题。可能有一种不同的设计方法来解决您的问题并不需要这个成员变量。