2

私はプログラムを続けなければなりません。私の前のプログラマーは、この構造をよく使用していました。

std:vector< T* const>

彼は Visual Studio C++ 2010 で ist を書き、これをコンパイルすることができました。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 でコンパイルされる理由を知っている人はいますか? 完全なコードを変更する必要なく、宣言でそれを置き換えることはできますか?

4

1 に答える 1

8

std::vectorAllocator を使用して、メンバーのメモリの割り当て、再割り当て、および割り当て解除を行います。XAllocator の要件は、typeの Allocator に対してのみ定義されますT。ここで、Tは「任意の非定数、非参照オブジェクト型」です (C++11 表 27)。したがって、 astd::vector<T* const>を使用すると、未定義の動作が発生します。これは、使用するアロケーターが const 要素型に対して定義されていないためです。

これはできるだけ早く修正した方がよいでしょう。宣言を に変更することで多くの問題が発生する可能性は低いstd::vector<T*>です。

于 2013-05-11T12:21:27.383 に答える