0

C ++で演算子をオーバーロードしようとしましたが、いくつか問題があります。これは私が私のクラスに持っているものです:

ostream & operator <<(ostream & s)
 {
  s << w();
 return s;

}
 string w()
{
stringstream ss;
string str;
for (int i=n-1; i>=0; i--)
{
    if (i==n-1)
    {
        ss<<tablica[i] << "x^" << i;
    }
    else
    {
        if (tablica[i]<eps && tablica[i]>-eps) ss <<"+" << +tablica[i]<< "x^" << i;
        else if (tablica[i]<eps)ss << tablica[i]<< "x^" << i;
        if(tablica[i]>eps) ss <<"+" << +tablica[i]<< "x^" << i;
    }

}
ss >> str;
return str;

}

私はこれを次のように使用しようとしています:

cout << p << endl;

エラー:no match for 'operator<<' in 'std::cout << p これが私のプログラムのコード全体です:http://codepad.org/xBijPMCp

4

4 に答える 4

4

ostream & operator <<(ostream & s)特定のクラスに関連して(それを有用にするために)実装する必要があるため、署名は次のようになります。

friend ostream & operator <<(ostream & s, const class_name &c);
于 2013-03-24T16:14:28.200 に答える
2

オーバーロードされた演算子は、2つの方法のいずれかで呼び出されます。として扱われるメンバー関数として、またはグローバルx op y;として扱われ、ここで。になります。x.op(y);x op y;op(x,y);

演算子がメンバー関数の場合、左側のオペランドは、演算子をオーバーロードする対象のオペランドでなければならないことに注意してください。ストリームに挿入する場合:x << y;、左側のオペランドはストリームオブジェクトであるため、演算子をメンバー関数としてオーバーロードするには、ストリームクラスのメンバーとしてオーバーロードを実行する必要があります。

ストリームクラスの変更はほとんど立ち入り禁止であるため、実際の選択は、オーバーロードをグローバル関数として実装することだけです。ただし、この場合、関数は2つのパラメーター(1つは左オペランド用、もう1つは右オペランド用)を取る必要があります。

したがって、挿入演算子には、ほとんどの場合、次のような署名が必要です。

std::ostream &operator<<(std::ostream &os, T const &t)

T挿入するタイプはどこにありますか)。

于 2013-03-24T16:27:26.083 に答える
1

演算子のオーバーロードは、対応する演算子が1つ以上の変数で使用されている場合に、特定の操作を実行する方法をコンパイラーに指示する機能です。

たとえば、コンパイラは-、演算子の使用方法に応じて、減算演算子に関して異なる動作をします。

  • -48などの数値の左側に配置すると、コンパイラーはその数値を負の値と見なします。
  • 80-712などの2つの整数値の間で使用される場合、コンパイラーは減算演算を適用します。
  • 整数と558-9.27などの倍精度数の間で使用される場合、コンパイラーは右の数から左の数を減算します。この操作により、倍精度の数値が生成されます。
  • シンボルが2倍になり、または-などの変数の片側に配置される場合、変数の値をデクリメントする必要があります。つまり、値1を減算する必要があります。--VariableVariable--

-減算演算子が適切に動作するようにさまざまなクラスで再構成されているため、これらの操作はすべて機能します。

于 2013-05-03T17:30:11.190 に答える
0

まず、一般的なデザインについて考える必要があります。<<変数のタイプを操作するためにオーバーロードしたいと思いますtablica。これoperator<<()は二項演算子です。宣言は次の形式である <<(Type t1, Type t2).必要があります:(メンバーにしたい場合、これは1つのパラメーターに対してのみ「degenarte」します。最初の左は一種のパラメーターになるためですthis)。あなたの場合、次のようなものです。

ostream & operator <<(ostream & s, const tablica_type &c);

あなたのタブリカはグローバル変数であり、nも通常は良い考えではありません。tablicaとnを保持するクラスを定義し、このクラスでは<<()をオーバーライドすることをお勧めします。

于 2013-03-24T16:34:15.560 に答える