2012-02-25 18 views
0

私は次のプログラムを持っている:変換演算子と演算子>>

class INT { 
public: 
    INT(int ii = 0) : i(ii) {} 
    operator int() { return i; } 
private: 
    int i; 
}; 

int main() 
{ 
    INT i; 
    cin >> i; 
} 

声明cin >> iはコンパイルエラーになりますが、私はその理由を知らないのですか? INTINT::operator int()を通じてintに変換することができますので、私のオプションで

は、コンパイラは、その文のための機能cin.operator>>(int&)を見つけることができます。

+0

完全なコンパイル出力を投稿できますか?それがあなたのコード全体なら、 'cin'ではなく' std :: cin'でなければなりません。 – hmjd

+0

あなたはINTとしてクラスを宣言しています。 – Invictus

+0

実際にここで何をしたいですか? – Invictus

答えて

2

operator int()operator int()は、operator>>が期待する非定数参照にバインドできない一時変数を返します(その変数を変更する必要があるため)。

operator int&()に変更し、constオーバーロードをoperator int const&() constと追加してください。

+0

私はそれを得た、すべてのthx! – xiaok

3

あなたはそれが参照を返すようにするあなたのintオペレータ変更して何をしようとして行うことができます:あなたは整数あなたのコピーを返却した時点で

operator int&() { return i; } 

を、その場合でも> >演算子は元の値を変更しませんでした。

0

私の助言は、< <と>>を友人としてオーバーロードして、参照によって渡されるストリームを持つプライベート変数にアクセスできるようにすることです。

class INT { 
public: 
    INT(int i = 0) : _i(i) {} 
    const int& getValue()const {return _i;} 
    void setValue(int i){_i=i;} 
    friend istream& operator>>(istream& in, INT& myINT); 

private: 
    int _i; 
}; 

friend istream& operator>>(istream& in, INT& myINT){ 
    int x; 
    in >> x; 
    myINT.setValue(x); 
    return in; 
}