2013-11-25 6 views
1

Итак, я посмотрел сюда, чтобы получить ответы на этот вопрос, но ни один из решений не работал для меня. Я перегружен оператор < < в отдельный класс «Operators.cpp» Точный код выглядит следующим образом:Неопределенная ошибка ссылки при перегрузке

#include "Rolo.h" 
#include "RoloHeader.h" 
#include "RoloParsedRecord.h" 
#include "RoloRawRecord.h" 


std::ostream& operator <<(std::ostream& outstream, const Rolo& rolo){ 
    string roloData = rolo.toString(); 
    outstream << roloData; 
    return outstream; 
} 

std::ostream& operator <<(std::ostream& outstream, const RoloHeader& roloHeader){ 
    string roloHeaderData = roloHeader.toString(); 
    outstream << roloHeaderData; 
    return outstream; 
} 

std::ostream& operator <<(std::ostream& outstream, const RoloParsedRecord& rpRecord){ 
    string rpRecordData = rpRecord.toString(); 
    outstream << rpRecordData; 
    return outstream; 
} 

std::ostream& operator <<(std::ostream& outstream, const RoloRawRecord& rrRecord){ 
    string rrRecordData = rrRecord.toString(); 
    outstream << rrRecordData; 
    return outstream; 
} 

В Rolo.h:

friend ostream& operator <<(ostream& outputStream, const Rolo& rolo); 
friend ostream& operator <<(ostream& outputStream, const RoloHeader& roloHeader); 
friend ostream& operator <<(ostream& outputStream, const RoloParsedRecord& rpRecord); 

Это называется в main.cpp как:

Rolo theRolo; 
theRolo.readRolo(inStream); //no issues here 
theRolo.sortRolo(sortTag); //no issues here either 
outStream << theRolo.toStringFormatted(); //prints out exactly as wanted, no issues 
outStream << theRolo; //this is where it chokes 

Когда я компилирую, я получаю:

Main.o: In function `main': 
Main.cpp:(.text.startup+0x3f9): undefined reference to `operator<<(std::ostream&, Rolo&)' 
collect2: error: ld returned 1 exit status 
make: *** [Aprog] Error 1 

Есть другие классы, которые отлично работают. Проблема возникает только при попытке использовать перегруженный < < в отличие от функции toStringFormatted().

Так что мой вопрос: что здесь происходит? Почему это не определено? И, что самое важное, что я могу сделать, чтобы исправить это?

ответ

1

Как вы это скомпилируете? Вы компилируете и связываете отдельно? Что вы можете сделать: вы говорите Main.cpp, что есть перегруженный оператор, включив Rolo.h. Он компилируется. Но компоновщик не может найти его реализацию.

+0

Именно так. Я должен был понять, что это так просто. Мне пришлось добавить его в make-файл. Большое значение. – user3029721

0

Вы не указали область действия оператора при определении функции. Не должно быть std::ostream& Rolo::operator <<(std::ostream& outstream, const Rolo& rolo)

Смежные вопросы