Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: c++4.3 не понимает вектор от вектора  (Прочитано 1934 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн barmale-y

  • Автор темы
  • Любитель
  • *
  • Сообщений: 59
    • Просмотр профиля
c++4.3 не понимает вектор от вектора
« : 13 Января 2009, 22:34:53 »
После установки обновлений компилятор c++ перестал собирать одну из программ. В чем ошибка?

строка 123:

std::vector<std::vector<double> > a(n,n+1);

$ c++ test.cc
/usr/include/c++/4.3/bits/stl_vector.h: In member function ‘void std::vector<_Tp, _Alloc>::_M_initialize_dispatch(_Integer, _Integer, std::__true_type) [with _Integer = int, _Tp = std::vector<double, std::allocator<double> >, _Alloc = std::allocator<std::vector<double, std::allocator<double> > >]’:
/usr/include/c++/4.3/bits/stl_vector.h:290:   instantiated from ‘std::vector<_Tp, _Alloc>::vector(_InputIterator, _InputIterator, const _Alloc&) [with _InputIterator = int, _Tp = std::vector<double, std::allocator<double> >, _Alloc = std::allocator<std::vector<double, std::allocator<double> > >]’
test.cc:123:   instantiated from here
/usr/include/c++/4.3/bits/stl_vector.h:932: ошибка: нет подходящей функции для вызова ‘std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >::_M_fill_initialize(size_t, int&)’
/usr/include/c++/4.3/bits/stl_vector.h:974: замечание: претенденты: void std::vector<_Tp, _Alloc>::_M_fill_initialize(size_t, const _Tp&) [with _Tp = std::vector<double, std::allocator<double> >, _Alloc = std::allocator<std::vector<double, std::allocator<double> > >]

Оффлайн Kwah

  • Старожил
  • *
  • Сообщений: 1442
  • Ubuntu 17.10
    • Просмотр профиля
Re: c++4.3 не понимает вектор от вектора
« Ответ #1 : 14 Января 2009, 00:32:43 »
Что ты хотел сказать этим кодом?
std::vector<std::vector<double> > a(n,n+1);Если типа задать 2-мерный массив, то учись работать с std::vector. Если что-то другое - давай подробности.

Хотя почитать что есть std::vector будет полезно в любом случае ;)

Оффлайн barmale-y

  • Автор темы
  • Любитель
  • *
  • Сообщений: 59
    • Просмотр профиля
Re: c++4.3 не понимает вектор от вектора
« Ответ #2 : 14 Января 2009, 00:51:09 »
Что ты хотел сказать этим кодом?
std::vector<std::vector<double> > a(n,n+1);Если типа задать 2-мерный массив, то учись работать с std::vector. Если что-то другое - давай подробности.

Хотя почитать что есть std::vector будет полезно в любом случае ;)

До обновления компилятора структура
// код-1
std::vector<std::vector<double> > a(n,n+1);
где size_t n = 100; воспринималась нормально. После обновлений нет. От ошибки компилятора отделался так
// код-2
   std::vector<double> vvv(n+1);
    std::vector<std::vector<double> > a(n,vvv);
.

Вопрос: это глюк компилятора или код-1 не по стандарту? Если глюк то кому сообщить :-) ?


Оффлайн Kwah

  • Старожил
  • *
  • Сообщений: 1442
  • Ubuntu 17.10
    • Просмотр профиля
Re: c++4.3 не понимает вектор от вектора
« Ответ #3 : 14 Января 2009, 02:35:56 »
Хм. Походу мне пора учиться. Comeau C++ Online вот такой код (ведь он же имелся в виду?)
#include <vector>

int main()
{
int n = 5;
std::vector<std::vector<double> > a(n, n+1);
}
вполне проглатывает (хоть я и не понимаю как), а он соответствием стандартам славится.

Ждём дальше у кого есть что сказать...

Оффлайн axe

  • Старожил
  • *
  • Сообщений: 1203
    • Просмотр профиля
Re: c++4.3 не понимает вектор от вектора
« Ответ #4 : 14 Января 2009, 02:58:20 »
Ждём дальше у кого есть что сказать...
Если я еще не совсем забыл C++, то здесь ситуация следующая:

у вектора есть такие конструкторы:
    vector();
    vector( const vector& c );
    vector( size_type num, const TYPE& val = TYPE() );
    vector( input_iterator start, input_iterator end );
, причем обратите внимание, что они не explicit. А это значит, что можно написать такое:
std::vector<int> v = 5;, и это будет корректный код, т.к. 5 неявно "обернется" в вызов std::vector<int>(5).

Именно это и происходит (должно происходить ??) со вторым параметром конструктора в строчке
Цитировать
std::vector<std::vector<double> > a(n, n+1);
Т.е. эта запись преобразуется к виду
Цитировать
std::vector<std::vector<double> > a(n, std::vector<double>(n+1));
, т.е. к корректному вызову конструктора vector( size_type num, const TYPE& val = TYPE() );

Почему перестало работать - хз :)
Думаю, стоит почитать ChangeLog к обновленной версии GCC. (А может, и в коде STL что-то подправили?)

ЗЫ. Если я где-то не прав - поправляйте смело, я давно уже не имел практики в C++, мог что-то важное и позабыть...

Оффлайн axe

  • Старожил
  • *
  • Сообщений: 1203
    • Просмотр профиля
Re: c++4.3 не понимает вектор от вектора
« Ответ #5 : 14 Января 2009, 03:02:43 »
Вот это:
/usr/include/c++/4.3/bits/stl_vector.h:932: ошибка: нет подходящей функции для вызова ‘std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >::_M_fill_initialize(size_t, int&)’
подсказывает, что компилятор перестал оборачивать второй параметр конструктора в вызов конструктора "внутреннего" вектора, а воспринимает его "в лоб", как ссылку на int.

Оффлайн Kwah

  • Старожил
  • *
  • Сообщений: 1442
  • Ubuntu 17.10
    • Просмотр профиля
Re: c++4.3 не понимает вектор от вектора
« Ответ #6 : 14 Января 2009, 03:26:11 »
Угу, логика понятна. И похоже на правду ;)

g++-4.1 и 4.2, кстати, кушают это дело за милу душу... Баг нужно бы разработчикам нарисовать.

С другой стороны, явное прописывание std::vector<std::vector<double> > a(n, std::vector<double>(n+1));решает проблему и улучшает читабельность кода.

 

Страница сгенерирована за 0.031 секунд. Запросов: 25.