2010-11-28 15 views
5

operator booloperator void*のクラスを作成しようとしましたが、コンパイラはあいまいであると言います。どのような演算子を使用するのか、あるいはその両方を持つことができないのか、コンパイラに説明できる方法はありますか?演算子void *と演算子boolの両方を定義します

class A { 
public: 
    operator void*(){ 
     cout << "operator void* is called" << endl; 
     return 0; 
    } 

    operator bool(){ 
     cout << "operator bool is called" << endl; 
     return true; 
    } 
}; 

int main() 
{ 
    A a1, a2; 
    if (a1 == a2){ 
     cout << "hello"; 
    } 
} 
+0

ていますか? 'operator void *'はやや安全な '演算子bool'として機能します。なぜならあなたは間違って' void * 'で行うことができる悪い事が少ないからです。また、悪用をさらに最小限に抑える安全なboolイディオムについては、googleを使用してください(間違っていない場合は、 'operator pointer-to-member'を定義します)。 – UncleBens

+0

実際、ifstreamのために用意した答えを参考にしています。私はなぜオペレータvoid *がオペレータboolの前に呼び出されたのだろうと思っていましたが、私がこれをしたときにはあいまいでした。 – Default

答えて

4

オペレータを直接呼び出すことができます。この場合

int main() 
{ 
    A a1, a2; 
    if (static_cast<bool>(a1) == static_cast<bool>(a2)){ 
     cout << "hello"; 
    } 
} 

コンバージョンに依存operator==()を定義してはならないように、しかし、それが見えます。

+0

[this thread](http://stackoverflow.com/q/4294285/238902)では必要ないようです。 'ifstream'はこれをどのように解決しますか? – Default

+0

.. istreamに 'operator bool()'があり、そのスレッドで 'operator void *'が呼び出されています。 'operator ==()'が問題を解決したので、 – Default

+0

が受け入れられました。そして、私は両方の変換演算子を持っています。 – Default

8

ここで問題となるのは、operator boolを定義していますが、その音からは、operator ==です。また、明示的にこのようなvoid *にキャストすることができます

if ((void *)a1 == (void *)a2) { 
    // ... 
} 

...しかし、それは本当に奇妙です。それをしないでください。その代わり、class A内部でこのようなあなたのoperator ==を定義する:あなたは、実際に両方を必要とすることを確認

bool operator==(const A& other) const { 
    return /* whatever */; 
} 
+0

ありがとうマイケル、+1。それは私を混乱させるiostreamsです.. – Default