【发布时间】:2015-07-14 12:10:52
【问题描述】:
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> ]
除了使用指针,还有什么办法可以解决这个问题吗?
【问题讨论】:
-
错误信息是什么?
-
错误 C2027: 使用未定义类型 'A' main.cpp(6) : 参见 'A' main.cpp(7) 的声明 : 参见类模板实例化 'std::deque' 正在编译 1> 与 1> [ 1> _Ty=A 1> ]
-
这真的是 run 与 GCC 吗?
-
有趣的是,
std::unique_ptr<A> next;作为结构成员在 MSVC2012 上工作。也许与标准库的实现方式有关。我想知道标准是否坚持认为该构造在这种情况下是有效的,而在您的情况下可能不是。 -
C++ 标准要求类型是完整的以实例化标准容器(否则未定义的行为,不需要诊断)。所以你不能在 A 的定义中使用
std::deque<A>,即使你前向声明它。由于std::deque<A>的迭代器类型不实例化就无法命名,恐怕这种设计行不通。
标签: c++ visual-studio-2010 cross-reference