2013-05-11 2 views
1

Мне нужно продолжить программу. Программист передо мной используется структура много:C++ std: vector < T* const>

std:vector< T* const> 

Он написал IST в Visual Studio C++ 2010 и был в состоянии собрать это. Я использую g ++, и он вызывает некоторые ошибки компиляции.

g++ -g -Wall -c -std=c++11 -pedantic -I/usr/include/SuperLU/ src/Cell.cpp -o obj/Cell.o 
In file included from src/Cell.cpp:13:0: 
src/Cell.h:81:2: warning: extra ';' [-pedantic] 
In file included from /usr/include/x86_64-linux-gnu/c++/4.7/./bits/c++allocator.h:34:0, 
       from /usr/include/c++/4.7/bits/allocator.h:48, 
       from /usr/include/c++/4.7/string:43, 
       from /usr/include/c++/4.7/bits/locale_classes.h:42, 
       from /usr/include/c++/4.7/bits/ios_base.h:43, 
       from /usr/include/c++/4.7/ios:43, 
       from /usr/include/c++/4.7/ostream:40, 
       from /usr/include/c++/4.7/iostream:40, 
       from src/Cell.cpp:2: 
/usr/include/c++/4.7/ext/new_allocator.h: In instantiation of 'struct __gnu_cxx::new_allocator<BattPackage::Leg* const>': 
/usr/include/c++/4.7/bits/allocator.h:89:11: required from 'class std::allocator<BattPackage::Leg* const>' 
/usr/include/c++/4.7/bits/alloc_traits.h:92:43: required from 'struct std::allocator_traits<std::allocator<BattPackage::Leg* const> >' 
/usr/include/c++/4.7/ext/alloc_traits.h:110:10: required from 'struct __gnu_cxx::__alloc_traits<std::allocator<BattPackage::Leg* const> >' 
/usr/include/c++/4.7/bits/stl_vector.h:76:28: required from 'struct std::_Vector_base<BattPackage::Leg* const, std::allocator<BattPackage::Leg* const> >' 
/usr/include/c++/4.7/bits/stl_vector.h:208:11: required from 'class std::vector<BattPackage::Leg* const>' 
src/Cell.h:283:39: required from here 
/usr/include/c++/4.7/ext/new_allocator.h:83:7: error: 'const _Tp* __gnu_cxx::new_allocator<_Tp>::address(__gnu_cxx::new_allocator<_Tp>::const_reference) const [with _Tp = BattPackage::Leg* const; __gnu_cxx::new_allocator<_Tp>::const_pointer = BattPackage::Leg* const*; __gnu_cxx::new_allocator<_Tp>::const_reference = BattPackage::Leg* const&]' cannot be overloaded 
/usr/include/c++/4.7/ext/new_allocator.h:79:7: error: with '_Tp* __gnu_cxx::new_allocator<_Tp>::address(__gnu_cxx::new_allocator<_Tp>::reference) const [with _Tp = BattPackage::Leg* const; __gnu_cxx::new_allocator<_Tp>::pointer = BattPackage::Leg* const*; __gnu_cxx::new_allocator<_Tp>::reference = BattPackage::Leg* const&] 

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

Насколько я понимаю, он не должен компилироваться, поскольку T * const не может быть назначен.

Кто-нибудь знает, почему он компилируется в Visual Studio? И могу ли я заменить это в объявлениях без необходимости изменения полного кода?

ответ

8

std::vector использует Allocator для распределения, перераспределения и освобождения памяти для своих членов. Требования Allocator определены только для Allocator X для типа T, где T является «любым неконстантным, не ссылочным объектом» (C++ 11, таблица 27). Таким образом, использование std::vector<T* const> дает вам неопределенное поведение, потому что используемый им распределитель не определен для типа элемента const.

Вам лучше исправить это как можно скорее. Вряд ли будет много проблем с изменением объявлений на std::vector<T*>.

+0

Тогда почему компилятор VS не может обнаружить эту проблему. Это ошибка компилятора? – shivakumar

+0

@shivakumar Это неопределенное поведение. Все может случиться. Это не ошибка, чтобы просто молча игнорировать его. –

+0

Хорошо, что работает для моих мыслей, почему это не удается. Итак, вы думаете, что VS просто принимает std :: vector ? – MagunRa

Смежные вопросы