1

它与此错误的问题相似

关于在 C++ 中将数组存储在 std::vector 中的问题

但出于不同的原因(见下文)。

对于以下 C++ 示例程序:

#include <vector>

int main(int c_, char ** v_)
{
        const int LENGTH = 100;

        std::vector<char[LENGTH]> ca_vector;

        return 0;

}

GCC 4.2.3 编译干净。GCC 4.3.2 发出以下错误:

/usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4/bits/stl_construct.h:在函数'void std::_Destroy(_Tp*) [with _Tp = char [100 ]]':
/usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4/bits/stl_construct.h:103: 从 'void std::_Destroy(_ForwardIterator, _ForwardIterator) [with _ForwardIterator =字符 (*)[100]]'
/usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4/bits/stl_construct.h:128: 实例化自 'void std::_Destroy(_ForwardIterator, _ForwardIterator, std::allocator& ) [with _ForwardIterator = char (*)[100], _Tp = char [100]]'
/usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4/bits/stl_vector.h:300:从 'std::vector::~vector() [with _Tp =字符 [100], _Alloc = std::allocator]'
test.cpp:7:从这里实例化
/usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4/bits/stl_construct.h:88:错误:在“* __pointer”中请求成员“~char [100]” ,它是非类类型'char [100]'

原因显然是这一点

包括/g++-v4/bits/stl_construct.h

  template
    inline void
    _Destroy(_Tp* __pointer)
    { __pointer->~_Tp(); }

我认为这被称为是由于不正确的数组到指针衰减。

我的问题是: 语言标准中是否有任何内容阻止在 std::vector 中存储数组?或者它只是那个特殊的 GCC 版本中的一个错误?

我相信这应该编译(即 4.2.3 是正确的)。

谢谢马丁

4

4 回答 4

6

是的,标准中有一些东西停止使用数组使用草案 C++98 标准

第 23 节 容器

这些组件中存储的对象类型必须满足 CopyConstructible 类型 (20.1.3) 的要求,以及 Assignabletypes 的附加要求。

其中组件是各种容器

20.1.3 包括该类型必须具有析构函数的要求。

我认为它是一个向量必须复制分配和删除元素。C++ 如何知道复制或删除 char[] ?

于 2009-10-13T12:15:59.687 回答
2

不,这是不允许的,就像您链接到的问题中不允许这样做一样(而且我看不出“原因有何不同”)。这两个问题中的任何一个都不是“错误”。或者至少,不是编译器中的错误。就在你的代码中。;)

您不能将数组存储在向量中,因为向量要求其元素是可复制构造和可分配的。

于 2009-10-13T12:42:03.357 回答
2

最简单的解决方案是:

std::vector<boost::array<LENGTH> > ca_vector;

这样您就不必为数组/指针的故事而烦恼。你是否真的想要这个,是另一个问题。

于 2009-10-13T12:46:56.377 回答
-1

请让我知道这段代码的想法。您已经知道,向量也是某种数组,您不必给出初始大小。

1D vector  ->  std::vector<char*> ca_vector;
2D vector  ->  std::vector<char*,char*> ca_vector;
于 2009-10-13T12:25:49.983 回答