2012-04-01 22 views
-1
class apple 
{ 
    public : 
    operator orange() const { cout << "operator"; } 
} ; 
class orange 
{ 
    public : 
    orange (apple &x){cout <<"constructor";} 
}; 
void f(orange o) 
{ 
    cout <<"function can accept only oranges "; 
} 
int main() 
{ 
    apple a; 
    f(a); 
} 

出力: コンパイラエラーコンストラクタが呼び出されたときにされたときにオペレータ機能

なぜこのコードをg ++コンパイラでコンパイルエラーを与えるのでしょうか?関数fが呼び出されたときにオレンジのコンストラクタが呼び出されないのはなぜですか?

+3

質問にエラーメッセージを追加してください。 –

+0

演算子+、演算子 - 、演算子=およびその他多くの演算子を使用できますが、 "演算子オレンジ"は使用できません。 – Imp

+5

@できることを確かめてください。 –

答えて

4

(私は本当にオレンジ:)にリンゴを変換する感覚は表示されませんが)あなたは、循環依存関係を持っています。とにかく、あなたはappleを定義する前にorangeを定義する必要があり、そしてあなたは、オペレータorange必要はありません。これは動作するはず

class apple; 
class orange 
{ 
public : 
    orange (apple &x){cout <<"constructor";} 
}; 
class apple 
{ 
public : 
}; 

を。

2

operator orange()は値を返しません。変換演算子のすべてのポイントは、インスタンスをタイプAからタイプBに変換することです。

オレンジのインスタンスを作成して戻す必要があります。

class apple 
{ 
public : 
    operator orange() const { cout << "operator"; } //depends on orange 
                //shouldn't compile 
} ; 
class orange 
{ 
public : 
    orange (apple &x){cout <<"constructor";} //depends on apple 
}; 

は、私はあなたがコンパイルエラーを取得していない驚いている:

+0

実際には、voidでない戻り値の型を持つ関数から値を返さないことは未定義の動作です。 –

+0

これは当てはまりますが、コンパイルエラーの原因ではありません。 –

+0

エラー:4行目の 'オレンジ'の前に予想される型指定子。オレンジを定義して使用してもコンパイラエラーが発生します。 – Luv

関連する問題