我有这段非常简单的代码;
#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
也没有警告。如果我将deque转换为vector,情况也是一样的。
我想使用MSVCC (cl)在windows上构建此代码,但不幸的是它抛出错误c2027:
error C2027: use of undefined type 'A'
然而,如果我将std::deque
更改为std::vector
,它可以在Visual Studio 2010中编译良好。
我的问题是;出于某种原因,这种行为是可以预料的吗?如果是这样,为什么编译器之间存在差异,或者这是g++/icc或MSVCC的错误?
这是未定义的行为(std::deque
和std::vector
),所以无论实现用它做什么都是好的,只要标准问题。实例化一个标准容器不完整类型
当用g++编译时,-Wall
(一般来说,所有选项都是从与-W
)只关注语言。对于库问题,您应该这样做也可以用-D_GLIBCXX_CONCEPT_CHECKS -D_GLIBCXX_DEBUG
-D_GLIBCXX_DEBUG_PEDANTIC
编译。(如果这会影响性能
-D
。在James Kanze的回答之后,我搜索了一下,发现了Dr Dobbs的这篇文章,其中解释了使用不完整类型容器的标准立场。
进一步暗示了它与vector
s而不是deque
s一起工作的原因,即实现。典型的向量可以是
class vector<T> {
T* buff;
int size;
// ... snip
};
对于不完整类型是可以的,因为我们只有一个指向T
的指针,但deque
可以很好地以这种方式实现(在VS2010中),它通过值使用T
,从而使其与不完整类型不兼容。