3

通常、文字列を比較できます。

if (var1 == "a string") ...

しかし、次のように、変換演算子を使用して独自のクラスを宣言すると、次のようになります。

class my_type {
   operator std::string() const { ... };
   ....
}

今これ:

 std::string var1("a string");
 my_type x("a string");
 if (x == "a string") ....
 if (x == var1) ....

動作しません..つまり...

error: no match for ‘operator==’ 

もちろん、これは機能します:

 if ((std::string) x == var1) ....

しかし、明示的にキャストせずにそれを実現したいと考えています。c++ が比較のために my_type を文字列に変換しないのはなぜですか。「==」演算子自体を実装せずにこれを強制するにはどうすればよいですか 他の比較演算子についても同様です。

ありがとうございました

PS>ところで、my_typeを数値に変換する演算子を実装すると(私のタイプでは問題ありません)...次のようになります:

 operator double() const { ... };

数値との比較は問題なく動作します。== などを実装する必要はありません.....

4

2 に答える 2

6

ここで指摘されているように、これは暗黙のキャストではなく、operator ==文字列での動作に関するものです。

operator ==ただし、クラスをオーバーロードし、暗黙の変換に依存しないことをお勧めします。

于 2012-09-11T14:42:27.927 に答える
2

文字列の operator == はオーバーロードではなくテンプレート化された演算子 (関数テンプレート) であるため、変換は機能しません (たとえば、http://en.cppreference.com/w/cpp/string/basic_string/operator_cmpを参照してください)。演算子 == 宣言)。

関数テンプレートの場合、引数の型はパラメーターと正確に一致する必要があります (暗黙的な変換なし)。違いを説明するために、文字列にオーバーロード << 演算子を導入しましょう。

#include <string>

struct X
{
    operator std::string() {return "X";}
};


std::string operator << (std::string const& s1, std::string const& s2)
{
  return s1+s2;
}

int main()
{
    X x;
    x<<std::string("bla"); // compiles fine
}

それはうまくコンパイルされます。

于 2012-09-13T14:36:08.363 に答える