4

次のコードを考えてみましょう。

class T;

void constructVector(const T* item)
{
   std::vector<T*> v;
   v.push_back(item);
}

MSVC 2010 コンパイラで次のエラーが発生します。

エラー: C2664: 'void std::vector<_Ty>::push_back(_Ty &&)' : パラメータ 1 を 'const T *' から 'T *&&' に [ _Ty=T * ] で変換できません 変換で修飾子が失われます

この特定の変換が違法であることはわかりますが、私のコードが意味的に間違っているとは思いません。またpush_back(const T&)、バリエーションがあると思いますが、それが私の呼び出しに一致しないのはなぜですか?

4

2 に答える 2

9

これは、非 const ポインターのベクトルであるためです。const ポインターを非 const ポインターに変換しません。それは const の目的を無効にします。

push_back(const T&) はあなたが探しているものではないと思います.Tオブジェクト自体がconstになり、Tのが(*)から(const *)に変更されないためです。

ベクトルを const ポインターのベクトルにすることができます。

void constructVector(const T* item)
{
    std::vector<const T*> v;
    v.push_back(item);
 }

または、関数を const 以外のポインターを取るように変更することもできます。

 void constructVector(T* item)
 {
    std::vector<T*> v;
    v.push_back(item);
 }
于 2013-09-12T18:33:30.840 に答える
1

落とすconst

void constructVector( const T* item);

また

使用する:

void constructVector(const T* item)
{
   std::vector<const T*> v;
   v.push_back(item);
}
于 2013-09-12T18:30:40.487 に答える