1

質問がばかげているなら、我慢してください。

ヘッダーファイルでは、次のように定義されています。

typedef char NAME_T[40];

struct NAME_MAPPING_T
{
    NAME_T englishName;
    NAME_T frenchName;
};

typedef std::vector<NAME_MAPPING_T> NAMES_DATABASE_T;

後で、特定の英語の名前を見つける必要があります。

const NAMES_DATABASE_T *wordsDb;

string str;

std::find_if(   wordsDb->begin(), 
                wordsDb->end(), 
                [str](const NAME_MAPPING_T &m) -> bool { return strncmp(m.englishName, str.c_str(), sizeof(m.englishName)) == 0; } );

このコード(正直にコピーして貼り付けたもの)はコンパイルされますが、find_if()によって返される値を確認したい場合は、次のようになります。

NAMES_DATABASE_T::iterator it;
it = std::find_if(blah ..)

コードはコンパイルされません!

実際には、 it = std :: find_if(...)という行 はエラーを返します:

error C2679: binary '=' : no operator found which takes a right-hand operand of type 'std::_Vector_const_iterator<_Myvec>' (or there is no acceptable conversion)

なにが問題ですか ?

御時間ありがとうございます。

4

1 に答える 1

5

const NAMES_DATABASE_T *wordsDb;

あなたwordsDbはconstであるためwordsDb->begin()、constイテレータを返します。したがってfind_if、constイテレータも返します。その定数イテレータを非定数に割り当てようとしているNAMES_DATABASE_T::iterator itため、エラーが発生します。

NAMES_DATABASE_T::const_iteratorconstイテレータを取得するために使用できます。またstd::string、他に必要なまれな状況がない限り、これらのcharバッファーの代わりに使用する必要があります。

于 2012-07-06T06:49:21.463 に答える