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 迭代器。您正在尝试将该 const 迭代器分配给 non-const NAMES_DATABASE_T::iterator it,因此会出现错误。

您可以使用NAMES_DATABASE_T::const_iterator来获取 const 迭代器。并且您应该使用std::string而不是那些 char 缓冲区,除非有一些罕见的情况需要另外使用。

于 2012-07-06T06:49:21.463 回答