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;
}
错误信息:
错误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迭代器的指针,其中元素类型是不完全类型是允许的,我担心最有可能用指向迭代器的指针替换迭代器并不能使该程序定义(尽管它可能使其在更多环境中工作)。如果将迭代器替换为指针:这肯定可以工作。我不能告诉你这是否是唯一的解决方案,因为你没有清楚地说明你要解决什么问题。可能存在一种不同的设计方法来解决您的问题,该方法不需要此成员变量。
相关文章:
- 未定义的引用 .. 使用 OpenCV 编译 C++ 代码时,从命令行
- Xcode 语义问题引用或以前定义的代码
- 如何编译使用循环引用的代码?
- 在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码
- 如何在 c# 代码中通过引用调用时从 c++ dll 更新数组值?
- 为什么我的C++代码无法编译,出现未定义的引用错误
- 我的代码中C++未定义的引用错误?
- 为什么从 constexpr 引用生成的程序集代码与从 constexpr 指针生成的程序集代码不同?
- 为什么此代码片段有效?如何取消引用空点?
- Android NDK.Build命令失败.未定义的引用.clang++:错误:链接器命令失败,退出代码为1
- 在没有引用传递资源的情况下,如何在java中简化这些代码
- 使用 Android NDK 使用 clang++ 编译C++代码时对"_Unwind_Resume"的未定义引用
- LLvm Jit:如何从抖动代码中取消引用运行时指针?
- 当我使用按引用返回时,我不知道这些代码之间的区别
- 寻找有关为什么此C++代码在没有引用的情况下不起作用的解释
- 此代码中的右值引用在哪里?
- 对静态库中SDL_mixer函数的未定义引用(代码::块)
- GNU GCC:尝试编译发行版时对"WinMain@16"的未定义引用(代码::Blocks)
- 可移植可执行文件是否可以直接绝对引用代码段中的外部库,而不是通过 IAT
- 链接器错误:对“vtable for square”的未定义引用.代码包括虚拟函数