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

以两种方式之一调用重载运算符。要么作为成员函数, wherex op y;被视为,要么作为x.op(y);全局函数, wherex op y;成为op(x,y);.

请注意,当运算符是成员函数时,左操作数必须是您重载运算符的那个。在插入流: 的情况下x << y;,左操作数是流对象,因此要将运算符重载为成员函数,您必须作为流类的成员进行重载。

由于修改流类几乎是禁止的,因此您唯一真正的选择是将重载实现为全局函数。然而,在这种情况下,函数必须接受两个参数(一个用于左操作数,一个用于右操作数)。

因此,插入运算符几乎总是需要如下签名:

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

T您要插入的任何类型在哪里)。

于 2013-03-24T16:27:26.083 回答
1

运算符重载是当对应的运算符用于一个或多个变量时,告诉编译器如何执行特定操作的能力。

例如,编译器对减法运算符的行为不同,-具体取决于运算符的使用方式。

  • 当它放在诸如 -48 之类的数值的左侧时,编译器会认为该数字为负值。
  • 当在两个整数值(例如 80-712)之间使用时,编译器会应用减法运算。
  • 当在整数和双精度数之间使用时,例如 558-9.27,编译器从右数中减去左数;该操作产生一个双精度数。
  • -符号翻倍放在变量的一侧时,如--Variableor Variable--,变量的值需要递减;换言之,应从中减去值 1。

所有这些操作都有效,因为减法运算符-已在各种类中重新配置以适当地执行。

于 2013-05-03T17:30:11.190 回答
0

您首先需要考虑您的总体设计。我认为您想重载<<以使用变量的类型tablica。是operator<<()二元运算符:声明必须采用以下形式:( <<(Type t1, Type t2).您是否希望它成为成员,这将“退化”为仅一个参数,因为第一个左侧将是一种this)。在您的情况下,例如:

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

您的 tablica 是一个全局变量,并且 n 也是,通常不是一个好主意。您可能想要定义一个包含 tablica 和 n 的类,并为这个类覆盖 <<()。

于 2013-03-24T16:34:15.560 回答