我有一段非常简单的代码;
#include <deque>
#include <vector>
using namespace std;
class A
{
public:
A(){};
~A(){};
deque<A> my_array; // vector<A> my_array;
};
int main(void)
{
}
如果我在linux上使用g ++和icc / icpc编译此代码,它编译得很好,即使使用-Wall
它也没有警告。如果我将双端队列交换为向量,情况就是一样。
我想在Windows上使用MSVCC(cl)构建此代码但不幸的是它抛出了错误c2027:
error C2027: use of undefined type 'A'
但是,如果我将std::deque
更改为std::vector
,则可以使用Visual Studio 2010进行编译。
我的问题是;这种行为是出于某种原因预期的吗?如果是这样,为什么编译器之间存在差异,或者这是g ++ / icc还是MSVCC的错误?
答案 0 :(得分:12)
这是未定义的行为(包括std::deque
和std::vector
,
因此无论实现如何处理它都没关系
标准是关注的。您正在使用实例化标准容器
不完整的类型。
使用g ++进行编译时,-Wall
(通常,所有选项都会启动
与-W
)仅关注语言。对于图书馆问题,你应该是
同时使用-D_GLIBCXX_CONCEPT_CHECKS -D_GLIBCXX_DEBUG
-D_GLIBCXX_DEBUG_PEDANTIC
进行编译。 (如果这导致表现
问题,您可以删除优化版本中的最后两个-D
。)
答案 1 :(得分:0)
继詹姆斯坎泽的回答之后,我搜索了一下this Dr Dobbs article,这解释了标准在使用不完整类型的容器时的立场。
此外,它暗示了它适用于vector
但不适用deque
的原因,即实施。典型的矢量可能类似于
class vector<T> {
T* buff;
int size;
// ... snip
};
这对于不完整类型是可以的,因为我们只有一个指向T
的指针,但是deque
很可能以这种方式实现(在VS2010中)它使用了T
因此,它与不完整的类型不兼容。