0

<<コードでフレンド関数としてオーバーロードしました。カスケード中にブレースを使用した後でも、まだエラーが発生します

error: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = 
std::char_traits<char>]((* & std::cout), ((const char*)"complex conjugate is ")) 
<< c.myComplex::operator~()’

クラスがありますmyComplex

class myComplex
{
    private:
    float real;
    float imaginary;    

    public:
    myComplex();
    myComplex(float a,float b);
    friend std::ostream& operator<<(std::ostream& iso,myComplex& a);
    myComplex operator~() const;
};

のオーバーロード<<~コンストラクタは次のとおりです。

std::ostream& operator<<(std::ostream& oso,myComplex& a)
{
    oso<<a.real<<" + "<<a.imaginary<<"i"<<std::endl;
return oso;
}

myComplex myComplex::operator~() const
{
    return myComplex(this->real,-1*this->imaginary);
}

myComplex::myComplex(float a,float b)
{
    real = a;
    imaginary = b;
}

以下のようにメインで使っていますが、

Line 1:    std::cout << "c is " << c << "\n";
Line 2:    std::cout << "a is " << a << "\n";

Line 3: ((std::cout <<"complex conjugate is ")<<(~c))<<"\n";

Line 3:    std::cout <<"complex conjugate is "<<~c<<"\n";

1 行目と 2 行目は問題なく動作しますが、3 行目でエラーが発生します。行 1 と 2 にカスケードでき、それ以降~cも返す場合、ostreamなぜエラーが発生するのですか?

4

4 に答える 4

3

一時オブジェクト (この場合は によって返される) は、非参照operator~()にバインドできません。constの引数を参照に変更operator<<()constます。

friend std::ostream& operator<<(std::ostream& iso,myComplex const& a);
于 2013-05-03T11:07:31.477 に答える
2

const myComplex &の代わりに使用myComplex &:

friend std::ostream& operator<<(std::ostream& iso, const myComplex& a);
                                                   ^^^^^

もちろん、実装を変更します。

于 2013-05-03T11:07:25.297 に答える
2

operator~()値で返すため、ostream& operator<<ここに一時オブジェクトをフィードしています。

std::cout <<"complex conjugate is "<< ~c <<"\n";
//                                    ^^ HERE! Temporary myComplex value.

演算子は、非 const 参照によって 2 番目の引数を取りますmyComplex&。非 const 参照は一時にバインドできません。に変更します

std::ostream& operator<<(std::ostream& oso, const myComplex& a);
于 2013-05-03T11:08:22.153 に答える
1

operator <<非 const 参照によって 2 番目のパラメーターを取得します。つまり、一時的なもの (によって返されるものなど) にバインドできません~。第 2 引数としてoperator <<受け入れるように変更します。const myComplex&

とにかくストリーム出力演算子がその引数を変更した場合、それは確かに奇妙です。

ところで、C++ には組み込みクラスがあることをご存知std::complexですか?

于 2013-05-03T11:09:04.540 に答える