C++ GCC 4.3.2 字符数组向量错误

问题描述 投票:0回答:4

问题与此错误类似

关于在 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 = char [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]”

原因显然是

include/g++-v4/bits/stl_construct.h 中的这一点

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

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

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

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

谢谢 马丁

c++ arrays vector destructor
4个回答
6
投票

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

第 23 条集装箱

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

其中组件是各种容器

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

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


2
投票

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

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


2
投票

最简单的解决方案是:

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

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


-1
投票

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

1D vector  ->  std::vector<char*> ca_vector;
2D vector  ->  std::vector<char*,char*> ca_vector;
© www.soinside.com 2019 - 2024. All rights reserved.