Visual Studio 2010 Express 无法使用交叉引用编译代码
Visual Studio 2010 Express couldn't compile code with cross reference
GCC 可以编译下面的代码,但 VS2010 express 不能:
#include <iostream>
#include <queue>
using namespace std;
struct A
{
deque<A>::iterator next;
};
int main()
{
A a;
}
错误信息:
error C2027: use of undefined type 'A' main.cpp(6) : see declaration of 'A' main.cpp(7) : see reference to class template instantiation 'std::deque<_Ty>' being compiled 1> with 1> [ 1> _Ty=A 1> ]
除了使用指针,还有什么办法可以解决这个问题吗?
如 中所讨论的示例,实例化具有不完整类型的标准容器是未定义的行为。为了能够访问 std::deque<A>
的迭代器类型,需要实例化此 class,因此您提供的程序具有未定义的行为。在此特定实例中,在 gcc 中未定义的行为恰好是您所期望的,而 Visual Studio(及其 Dinkumware 标准库实现)恰好无法编译。 Visual Studio 可能在调试和发布模式下表现不同,因为在调试模式下,容器(和迭代器)要复杂得多,以便能够检查许多迭代器滥用。
我无法快速找到一个引用,该引用允许在元素类型为不完整类型的情况下声明指向双端队列迭代器的指针,恐怕很可能用指向迭代器的指针替换迭代器不会定义这个程序(尽管它可能使它在更多环境中工作)。如果您要用指针替换迭代器:这肯定会起作用。我不能告诉你这是否是唯一的解决方案,因为你没有明确说明你试图解决的问题。可能针对您的问题有不同的设计方法,不需要此成员变量。
GCC 可以编译下面的代码,但 VS2010 express 不能:
#include <iostream>
#include <queue>
using namespace std;
struct A
{
deque<A>::iterator next;
};
int main()
{
A a;
}
错误信息:
error C2027: use of undefined type 'A' main.cpp(6) : see declaration of 'A' main.cpp(7) : see reference to class template instantiation 'std::deque<_Ty>' being compiled 1> with 1> [ 1> _Ty=A 1> ]
除了使用指针,还有什么办法可以解决这个问题吗?
如 std::deque<A>
的迭代器类型,需要实例化此 class,因此您提供的程序具有未定义的行为。在此特定实例中,在 gcc 中未定义的行为恰好是您所期望的,而 Visual Studio(及其 Dinkumware 标准库实现)恰好无法编译。 Visual Studio 可能在调试和发布模式下表现不同,因为在调试模式下,容器(和迭代器)要复杂得多,以便能够检查许多迭代器滥用。
我无法快速找到一个引用,该引用允许在元素类型为不完整类型的情况下声明指向双端队列迭代器的指针,恐怕很可能用指向迭代器的指针替换迭代器不会定义这个程序(尽管它可能使它在更多环境中工作)。如果您要用指针替换迭代器:这肯定会起作用。我不能告诉你这是否是唯一的解决方案,因为你没有明确说明你试图解决的问题。可能针对您的问题有不同的设计方法,不需要此成员变量。