2012-01-25 18 views
2

は、次のコードを想定します。なぜキャスト演算子を比較に使用できないのですか?

#include <string> 
#include <iostream> 
using namespace std; 
struct A 
{ 
    operator int() 
    { 
     return 123; 
    } 
    operator string() 
    { 
     return string("abc"); 
    } 
}; 
void main() 
{ 
    A a; 
    cout<<(a==123)<<endl; 
    //cout<<(a==string("abc"))<<endl; 
} 

まず、私はint変数とオブジェクトaを比較します。次に、私はそれをstring変数と比較しようとしますが、プログラムファイルをコンパイルします。比較を含む行がコメントアウトされているので、コンパイルはうまくいきます。何が問題ですか?変換が適切に起こる保証し

+2

コンパイラエラーはありますか?それは何と言いますか?それはあなたに何かを教えたのですか?おそらく、これらのパラメータ型で利用可能な演算子のオーバーロードはありませんか? –

+0

このような演算子を 'const'にすると、' const A object; 'に使うことができます。例えば、演算子int()const {...} 'のようになります。 – iammilind

答えて

1

あなたはintなどstd::stringにあなたのクラスの変換演算子を提供し、

しかし、==を動作させるには、比較するタイプに==が定義されている必要があります。
タイプの場合は暗黙的な==が提供されますが、std::stringの場合は==演算子のオーバーロードが原因でエラーが発生します。

+0

したがって、簡単に言えば、「int比較は言語機能ですが、文字列比較はライブラリ機能です」 –

+1

@KerrekSB:簡単に言えば、 'operator =='を使った 'std :: string'の比較は言語仕様では必要ではないが、おそらくライブラリによって提供される機能かもしれない。 –

+0

-1これはすべて間違っているようです。 C++標準では、std :: string alrightが記述されています。そしてそれはすべて、 'operator =='がテンプレートであるかどうかとは無関係であり、ユーザー定義のオーバーロードと組み込みではありません。 – UncleBens

関連する問題