Visual Studio 2010 Express 无法编译具有交叉引用的代码

Visual Studio 2010 Express couldn't compile code with cross reference

本文关键字:引用 代码 编译 2010 Studio Express Visual      更新时间:2023-10-16

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

#include <iostream>
#include <queue>
using namespace std;
struct A
{
  deque<A>::iterator next;
};
int main()
{
  A a;
}

错误信息:

错误C2027:使用未定义类型'A' main.cpp(6):参见'A' main.cpp(7):参见类模板实例化的参考'std::deque<_Ty>'正在编译1>与1> [1> _Ty=A 1>]

除了使用指针,还有什么方法可以解决这个问题吗?

如在std::vector中如何使用前向声明类所讨论的那样?,实例化具有不完整类型的标准容器是未定义的行为。为了能够访问std::deque<A>的迭代器类型,需要实例化这个类,所以你给出的程序具有未定义的行为。在这个特定的实例中,在gcc中未定义的行为恰好是您所期望的,而Visual Studio(与其Dinkumware标准库实现)恰好无法编译。Visual Studio在调试和发布模式下的行为很可能是不同的,因为在调试模式下,容器(和迭代器)要复杂得多,以便能够检查许多迭代器的滥用。

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