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

标签 c++ visual-studio-2010 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> ]

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

最佳答案

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

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

关于c++ - Visual Studio 2010 Express 无法使用交叉引用编译代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31406210/

相关文章:

c++ - 如何在没有安装 CUDA 工具包的机器上运行编译后的 CUDA 代码?

Excel 结构化引用表语法

python - Sphinx meth 角色不创建链接

c++ - 如何将c++实验库添加到mac编译器?

c++ - 迭代器的 STL 容器如何运行?

c++ -/usr/lib64/libstdc++.so.6 : version `CXXABI_1.3.8' not found when loading R packages

c++ - 调用函数时 CUDA/GPU 中的异常错误

c++ - C++是否被视为Von Neumann编程语言?

c# - 如何用空格或缩进注释多行

java - 从另一个类引用 MainActivity 中的 RadioButton 时出错