1. ホーム
  2. c++

エラー C2678 解答

2022-02-26 08:22:04
<パス

UE4使用時に発生
error C2678: binary '==' : type 'const HUDMessage ' の左側のオペランドを取る演算子が見つからない(または許容できる変換がない)。

最終的にはここに位置することができます

int32 Find(const ElementType& Item) const
    {
        const ElementType* RESTRICT Start = GetData();
        for (const ElementType* RESTRICT Data = Start, *RESTRICT DataEnd = Data + ArrayNum; Data ! = DataEnd; ++Data)
        {
            if (*Data == Item)//here
            {
                return static_cast<int32>(Data - Start);
            }
        }
        return INDEX_NONE;
    }

見ての通り、TArrayのFindメソッドを使用しているためですが、TArrayに格納されているカスタムタイプHUDMessageは==演算子をオーバーロードしていないため、*Data == Itemでは指定した演算子のオーバーロードを見つけることができません。そこで、追加します。

bool HUDMessage::operator == (const HUDMessage& a)
    {
        return this->text.ToString() == a.text.ToString();
    }

その結果、やはりエラーが報告されました...。
最後に、もう一度エラーメッセージをよく読んでみると
左側のオペランドが 'const HUDMessage' 型の場合
この文では、受け入れたオペランドがconst HUDMessageであることに言及しているので、文脈からわかるようにDataがconst型であることが明らかになり、今回コンパイラは、左オペランドが通常の変数で右オペランドがconstである演算子==ではなく、左と右がともにconstである演算子を探してオーバーロードしました。 ==. だから解決策は2つあります。
1. const 修飾子で関数をオーバーロードすると、コンパイル時に追加された this ポインタが const になり、つまり左オペランドが const になります。

bool HUDMessage::operator == (const HUDMessage& a)const
    {
        return this->text.ToString() == a.text.ToString();
    }

2. 対応する演算子の直接グローバルオーバーローディング

bool operator ==(const HUDMessage& a,const HUDMessage& b)
{
    return a.text.ToString() == b.text;
}

しかし、ヘッダーファイルのインクルード順のため、メソッド2は常に再定義されるため、メソッド1が選ばれ、コンパイルされることになります。
この問題は、やはりエラーを注意深く見るべきだということを教えてくれています。