5

エラー:
エラー C2678: バイナリ '==' : 型 'const entry' の左側のオペランドを取る演算子が見つかりません (または、受け入れ可能な変換がありません)

関数:

template <class T, int maxSize>
int indexList<T, maxSize>::search(const T& target) const
{
    for (int i = 0; i < maxSize; i++)  
        if (elements[i] == target)   //ERROR???
            return i;       // target found at position i

    // target not found
    return -1;
}

indexList.h
indexList.cpp

これはオーバーロードされた演算子であると思われますか? テンプレートクラスであるため、エラーを理解しているかどうかわかりませんか?

解決策 - クラスのオーバーロード関数が const として宣言されるようになりました:

//Operators
bool entry::operator == (const entry& dE)  const <--
{
    return (name ==dE.name);

}
4

6 に答える 6

9

エラーテキストをそのまま読むことから始めます。

バイナリ '==' : タイプ 'const entry' の左側のオペランドを取る演算子が見つかりません

これは、型を左オペランドとして==受け入れる演算子が見つからないことを意味します。entryこのコードは無効です:

entry const e;
if (e == foo)

リスト クラスのコードを示していただきましたが、それがエラーの原因ではありません。エラーは、それが何であれ、型の演算子が不足していることに関するentryものです。クラスに関数を指定するか、最初のパラメーターとしてa を受け入れるoperator==スタンドアロン関数を宣言します。operator==const entry&

struct entry {
  bool operator==(const entry& other) const;
};
// or
bool operator==(const entry& lhs, const entry& rhs);

後者が好ましいスタイルだと思います。

于 2009-04-07T16:06:59.127 に答える
6

この問題は、このインスタンスで使用されている型 T に operator== が定義されていないことが関係しています。あなたの質問から、これはクラスの「エントリー」だと思います。

また、'entry' クラスに operator== が正しく定義されておらず、const entry& をパラメーターとして使用していない可能性もあります。

于 2009-04-07T16:01:30.310 に答える
2

これはおそらく「constポイズニング」でありconst、検索関数の宣言で を使用すると、const呼び出すすべてのダウンストリーム関数のバージョンを追加する必要があります。

宣言された関数ではconstthisポインターが考慮されます。constつまり、そのポインターを介して使用するすべてのメンバーも考慮constされます。特化している型 T がパラメータをoperator == ()明示的に指定していないconst場合、このエラーが発生します。

使用するすべての T に適切なoperator == ()呼び出しがあることを確認できない場合は、メンバー関数テンプレートの const 指定子を削除します。

于 2009-04-07T16:02:17.547 に答える
1

このクラスのパラメーターとして使用している型 T には、指定しoperator==()たコードにテンプレートのインスタンス化が含まれていないため、何が問題なのかを知るのが難しい必要があります。

別の注意として、テンプレートの関数定義は、クラスとともに .h ファイルにある必要があります。そうしないと、コンパイラはテンプレートを適切にインスタンス化できません。

于 2009-04-07T16:02:45.703 に答える
1

ユーザー定義型の等価演算子は、既定では定義されていません。これはテンプレート クラスとは関係ありませんが、structclassエントリ」とは関係ありません。

したがって、 instruct entryまたはの等値演算子をオーバーライドする必要がありますclass entry

または、そのテンプレートを使用して等値演算子を定義するすべてのものを強制したくない場合は、等値比較を行う Comparator を受け入れるようにテンプレート インターフェイスを変更できます。

于 2009-04-07T16:05:06.040 に答える
0

書くだけで十分な場合もある

...
    if (target == elements[i])
...
于 2009-04-07T16:44:57.910 に答える