-2

私は単純な構造を作りました:

struct sToken
{
    std::string token;
    unsigned int lineNb;
};

push_back()メソッドを使用してこの構造を標準ベクトルに挿入したいのですが、これを行うと:

std::vector<sToken> result;
result.push_back(tkn); //compiler-error

次のエラー メッセージが表示されます。 no match for operator== in __first__gnu_cxx::__normal_iterator<_Iterator,_Container>::operator*<sToken*,std::vector<sToken> >()== in stl_algo.h

しかし、標準の文字列を入れたい場合は、すべて問題ありません。

std::vector<std::string> result;
result.push_back(tkn.token); //OK

コンパイラが について不平を言っているようoperator==ですが、なぜですか? operator==構造体をベクトルに入れたいだけなのに、なぜこのような状況で提供する必要があるのですか? また、この演算子を実装する必要がある場合は、実装方法を教えてください。ありがとう。

4

3 に答える 3

1

std::find を使用していると言ったように、構造体で演算子 == をオーバーロードする必要があります

struct sToken
{
    std::string token;
    unsigned int lineNb;
    bool operator ==(const sToken& ref )
    {
        return ref.token.compare( this->token ) == 0;
    }
};

この例でtokenは、この構造体を他の構造体と区別する (識別する) ために使用されます。もちろん、好きなように変更できます

編集

std::findコメントのように を探して使用する場合std::string tkn.token は、次のようにオーバーロードする必要があります。

bool operator ==(const std::string ctoken)
{
    return ctoken.compare( this->token ) == 0;
}

ベクトルメンバーをオブジェクトstd::findと比較するため、これを行う必要があります。sToken

于 2013-06-21T09:37:55.273 に答える