错误C2679:二进制'<<' :找不到哪个运算符采用'void'类型的右手操作数(或者没有可接受的转换)

时间:2014-04-22 22:11:41

标签: c++ overloading

我不确定问题是什么。它给了我错误:

错误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_ */

3 个答案:

答案 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; 以便导致错误。

&#xA;&#xA;

添加 printX()将解决问题!

&#xA;&#xA;

祝你好运!

&#XA;