我不确定问题是什么。它给了我错误:
错误C2679:二进制'<<' :找不到哪个运算符采用'void'类型的右手操作数(或者没有可接受的转换)
我重载了<<所以它不应该给我这个错误,对吗?
#ifndef ANIMAL_H_
#define ANIMAL_H_
#include <iostream>
#include <string>
using namespace std;
static int counter;
static int getAnimalCount() { return counter; }
class Animal {
protected:
string *animalType;
public:
virtual void talk() = 0;
virtual void move() = 0;
string getAnimalType() { return *animalType; }
//PROBLEM RIGHT HERE V
friend ostream& operator<<(ostream&out, Animal& animal) {
return out << animal.getAnimalType() << animal.talk() << ", " << animal.move();
};
~Animal() {
counter--;
animalType = NULL;
}
};
class Reptile : public Animal {
public:
Reptile() { animalType = new string("reptile"); };
};
class Bird : public Animal {
public:
Bird() { animalType = new string("bird"); };
};
class Mammal : public Animal{
public:
Mammal() { animalType = new string("mammal"); };
};
#endif /* ANIMAL_H_ */
答案 0 :(得分:4)
virtual void talk() = 0;
指定返回类型为void
的函数。这意味着它不会返回任何东西。将Animal::move
定义为virtual void move() = 0;
时会发生同样的情况。
out << animal.getAnimalType() << animal.talk() << ", " << animal.move();
尝试打印animal.talk()
的结果和animal.move()
的结果 - 两者都不存在(请记住,talk()
和move()
都不会返回值!)
答案 1 :(得分:2)
您的重载<<
运算符如下所示:
return out << animal.getAnimalType() << animal.talk() << ", " << animal.move();
首先,talk()
和move()
方法返回void
。你不能打印无效。
答案 2 :(得分:0)
点是代码生成器。我有类成员Dot.printX(),并在输出流中使用 cout&lt;&lt;&lt; Dot.printX&lt;&lt; endl;
以便导致错误。
添加 printX()
将解决问题!
祝你好运!
&#XA;