Оператор вставки перегрузки в C ++ - PullRequest
3 голосов
/ 11 ноября 2009

У меня есть класс, в котором я пытаюсь перегрузить оператор <<. По какой-то причине он не перегружен. </p>

Вот мой файл .h:

friend std::ostream& operator<<(std::ostream&, const course &); //course is my class object name

в моем .cpp, у меня есть это как моя реализация:

std::ostream& operator<<(std::ostream &out, const course & rhs){
    out << rhs.info;
    return out;
}

Это должно быть правильно, но когда я пытаюсь его скомпилировать, он говорит, что cout << tmp; не определено в ostream. </p>

Я включил iostream в мои .cpp и .h

Я вырывал свои волосы, пытаясь понять это. Вы видите что-нибудь, что не так с этим?

EDIT: Поскольку то, что я делаю, кажется правильным, вот весь мой исходный код: http://pastebin.com/f5b523770

строка 46 - мой прототип

строка 377 - реализация

В строке 435 происходит сбой при попытке его скомпилировать.

также, я только что попытался скомпилировать его на другом компьютере, и вместо этого выдается эта ошибка:

course.cpp:246: error: non-member function 'std::ostream& operator<<(std::ostream&, const course&)' cannot have cv-qualifier
make: *** [course.o] Error 1

Ответы [ 4 ]

3 голосов
/ 11 ноября 2009

Синтаксис, который вы перечислили, верен, но для правильной работы прототип перегруженного оператора должен быть объявлен в определении course .

course.h

class course {
public:
  friend std::ostream& operator<<(std::ostream&, const course&);
private:
  int info;
}

course.cpp

std::ostream& operator<<(std::ostream &out, const course &rhs){
  out << rhs.info;
  return out;
}
1 голос
/ 11 ноября 2009

Это выглядит хорошо для меня. Вот моя версия этого:

course.h

#include <iostream>

class course
{
public:
    friend std::ostream& operator<<(std::ostream&, const course &); //course is my class object name
    int info;
    course(){info = 10;}
};

course.cpp

#include <iostream>    
#include "course.h"

std::ostream& operator<<(std::ostream &out, const course & rhs)
{
    out << rhs.info;
    return out;
}

main_file.cpp

#include <iostream>
#include "course.h"

int main()
{
    course a;
    std::cout<<a;

    return 0;
}
1 голос
/ 11 ноября 2009

Вы должны включить остальную часть кода, я не думаю, что мы можем видеть, где проблема.

Работает следующий тривиальный пример:

class course
{
public:
    course(int info) : info(info) { }
    int info;

    friend std::ostream& operator<<(std::ostream&, const course &);
};

std::ostream& operator<<(std::ostream &out, const course & rhs)
{
    out << rhs.info;
    return out;
}

int main(int, char*[])
{
    course tmp(3);
    std::cout << tmp;
    return 0;
}
0 голосов
/ 30 ноября 2011

Я нашел это полезным!

Мои операторы вставки и извлечения немного отличаются.

здесь они определены:

друг ostream & operator << (ostream & fout, тип данных toPrint) </p>

друг istream & operator >> (istream & fin, тип данных и toReadTo)

синтаксис должен быть точным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...