ostream в классе не имеет типа

Просто попал в C ++ и у меня есть быстрый вопрос.

После компиляции с

g++ *.cpp -o output

Я получаю эту ошибку:

error: 'ostream' in 'class Dollar' does not name a type

Это мои три файла:

main.cpp

#include <iostream>
#include "Currency.h"#include "Dollar.h"
using namespace std;

int main(void) {
Currency *cp = new Dollar;

// I want this to print "printed in Dollar in overloaded << operator"cout << cp;
return 0;
}

Dollar.cpp

#include <iostream>
#include "Dollar.h"
using namespace std;

void Dollar::show() {
cout << "printed in Dollar";
}

ostream & operator << (ostream &out, const Dollar &d) {
out << "printed in Dollar in overloaded << operator";
}

Dollar.h

#include "Currency.h"
#ifndef DOLLAR_H
#define DOLLAR_H

class Dollar: public Currency {
public:
void show();
};

ostream & operator << (ostream &out, const Dollar &d);

#endif

Спасибо за ваше время, и все помогает!

2

Решение

У вас есть несколько ошибок в коде.

  1. Вы интенсивно используете using namespace std, Это плохая практика. В частности, это привело к ошибке, с которой вы столкнулись: у вас нет using namespace std в Dollar.hТаким образом, компилятор понятия не имеет, что ostream средства. Либо поставить using namespace std в Dollar.h тоже, или лучше просто прекратить использовать его и указать std пространство имен напрямую, как в std::ostream,
  2. Ты используешь std::ostream в ваших заголовках, но вы не включаете соответствующий стандартный заголовок библиотеки <ostream> в них (<ostream> содержит определение std::ostream учебный класс; для полной библиотеки ввода / вывода включить <iostream>). Хорошей практикой является включение всех зависимостей заголовка в сам заголовок, чтобы он был автономным и мог быть безопасно включен где угодно.
  3. Вы реализуете оператор вывода потока с подписью std::ostream & operator << (std::ostream &, Dollar const &), что совершенно справедливо. Тем не менее, вы называете это для указатель печатать Dollar, Вы должны скорее назвать это с объект сам по себе, а не указатель, поэтому вы должны разыменовать указатель: std::cout << *cp;,
  4. Вы реализовали оператор вывода для Dollar класс, но используйте его для переменной типа Currency: это не сработает. Есть способ сделать это — существуют виртуальные методы именно по этой причине. Однако в этом случае оператор является свободной функцией, поэтому он не может быть виртуальным. Итак, вам, вероятно, следует добавить виртуальный print метод к вашему Currency класс, реализовать его в Dollarи вызвать его из оператора вывода:

    #include <iostream>
    
    class Currency {
    public:
    virtual void print (std::ostream &) const = 0;
    };
    
    class Dollar : public Currency {
    void print (std::ostream & out) const override {
    out << "A dollar";
    }
    };
    
    std::ostream & operator << (std::ostream & out, Currency const & c) {
    c.print(out);
    return out;
    }
    
    int main(/* void is redundant here */) {
    Currency *cp = new Dollar;
    std::cout << *cp;
    // return 0 is redundant in main
    }
    
6

Другие решения

Вам нужно #include <iostream> в пределах Dollar.h, чтобы ваш std::ostream & operator разрешается компилятором.

0

По вопросам рекламы [email protected]