C ++ GCC 4.3.2 ошибка на векторе char-массива - PullRequest
1 голос
/ 13 октября 2009

Это похоже на проблему с этой ошибкой

Вопрос о сохранении массива в std :: vector в C ++

но по другой причине (см. Ниже).

Для следующего примера программы на 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: In function ‘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:   instantiated from ‘void std::_Destroy(_ForwardIterator, _ForwardIterator) [with _ForwardIterator = char (*)[100]]’
/usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4/bits/stl_construct.h:128:   instantiated from ‘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:   instantiated from ‘std::vector::~vector() [with _Tp = char [100], _Alloc = std::allocator]’
test.cpp:7:   instantiated from here
/usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4/bits/stl_construct.h:88: error: request for member ‘~char [100]’ in ‘* __pointer’, which is of non-class type ‘char [100]’

Причина, по-видимому, в этом бите в

include/g++-v4/bits/stl_construct.h 
  template
    inline void
    _Destroy(_Tp* __pointer)
    { __pointer->~_Tp(); }

который вызывается, я думаю, из-за неправильного распада массива в указатель.

Мой вопрос: Есть ли в стандарте языка что-либо, запрещающее хранение массивов в std :: vector? Или это просто ошибка в этой специальной версии GCC?

Я считаю, что это должно скомпилироваться (т. Е. 4.2.3 правильно).

Спасибо мартин

Ответы [ 4 ]

6 голосов
/ 13 октября 2009

Да, в стандартной остановке с использованием массивов что-то есть Использование Черновик C ++ 98 Standard

Секция 23 Контейнеры

Тип объектов, хранящихся в этих компонентах, должен соответствовать требованиям CopyConstructible. типы (20.1.3) и дополнительные требования присваиваемых типов.

, где компонентами являются различные контейнеры

20.1.3 включает требование, чтобы тип имел деструктор.

Я думаю, что это как вектор должен копировать, выделять и удалять элементы. Как C ++ знает, как копировать или удалять символ []?

2 голосов
/ 13 октября 2009

Самое простое решение для этого:

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

Таким образом, вам не нужно беспокоиться о массиве / указателе. Если вы действительно этого хотите, это другой вопрос.

2 голосов
/ 13 октября 2009

Нет, это не разрешено, точно так же, как это было запрещено в вопросе, с которым вы связаны (и я не вижу, как «причина отличается»). Это не «ошибка» ни в одном из двух вопросов. Или, по крайней мере, не ошибка в компиляторе. Просто в вашем коде. ;)

Вы не можете сохранить массив в векторе, потому что вектор требует, чтобы его элементы были конструируемыми и назначаемыми для копирования.

0 голосов
/ 13 октября 2009

Пожалуйста, дайте мне знать об этом коде. Вы уже знаете, вектор также является своего рода массивом, и вам не нужно указывать начальный размер.

1D vector  ->  std::vector<char*> ca_vector;
2D vector  ->  std::vector<char*,char*> ca_vector;
...