0

拜托,也许,我太累了,因为我似乎无法弄清楚为什么这个输入流运算符重载函数会抱怨......这是.h声明:

friend std::istream& operator>>(std::istream& in,  IntOperatorClass& intoperatorClass)

这是 .cpp 声明:

std::istream& operator >>(std::istream& in,  IntOperatorClass& intoperatorClass)
     {
         in>>intoperatorClass.value;
         return in;
     }

该类有一个名为 value 的私有变量..

班上 :

class IntOperatorClass{
     int value; //a value
     int arr[10];//an array value
 public:
     IntOperatorClass();//default constructor
     IntOperatorClass(int);//constructor with parameter
     IntOperatorClass(int arr[], int length);//an array constructor
     IntOperatorClass(const IntOperatorClass& intoperatorClass);//copy constructor
     IntOperatorClass& operator=(const IntOperatorClass& intoperatorClass);//assignment operator
     friend std::ostream& operator <<(std::ostream& out,  const IntOperatorClass& intoperatorClass);//output operator;
     friend std::istream& operator>>(std::istream& in,  IntOperatorClass& intoperatorClass);//input operator
     IntOperatorClass& operator++();//pre increment operator
     IntOperatorClass operator++(int);//post increment operator
     friend IntOperatorClass operator+(const IntOperatorClass intoperatorClassFirst , const IntOperatorClass intoperatorClassSecond);
     int GetValue(){return value;}
 };

是不是我做错了什么,因为编译器一直抱怨“>>”没有定义..

./op.cpp: In function 'std::istream& operator>>(std::istream&, IntOperatorClass&)':
../op.cpp:77: error: no match for 'operator>>' in 'in >> intoperatorClass->IntOperatorClass::value'
../op.cpp:75: note: candidates are: std::istream& operator>>(std::istream&, IntOperatorClass&)
4

2 回答 2

7

让我们分解错误:

../op.cpp:77: error: no match for 'operator>>' in
'in >> intoperatorClass->IntOperatorClass::value'

首先,编译器告诉你错误在op.cpp第 77 行

我打赌你就是这条线:

     in>>intoperatorClass.value;

错误的下一点是:

no match for 'operator>>' in 'in >> intoperatorClass->IntOperatorClass::value'

编译器说在你的内部operator>>它不知道如何使用另一个operator>>从一个提取istream到你的value成员中,这是一个int

然后它会告诉你它唯一看起来像 an 的候选人operator>>是你的候选人,它提取到一个IntOperatorClassnot anint中。

它应该有很多其他候选对象,用于提取整数、双精度数、字符串和其他类型。编译器不知道如何做到这一点的唯一方法是,如果您没有包含定义的标头istream及其运算符。

这样做:

#include <istream>

op.cpp文件的顶部。

大概你<iosfwd>直接或间接地包含了某个地方,它声明std::istream为一种类型,但没有包含<istream>它完全定义它。

于 2013-03-09T00:13:05.267 回答
3

不要忘记包含适当的标题:

#include <istream>

大概您包含一些标题,该标题std::istream以某种方式包含但不包含标题的全部内容<istream>

于 2013-03-09T00:11:07.647 回答