Итак, я не использовал C ++ в течение пары месяцев, и моей единственной проблемой было использование нескольких заголовков. В настоящее время моя проблема в том, что все мои заголовки для классов связаны с основным заголовком, который используют файлы .cpp. Я использую ifndef, чтобы убедиться, что ничего не повторяется, но я думаю, что проблема заключается в том, что одна группа файлов компилируется из-за того, что вывод моей сборки был
1> student.cpp
1> person.cpp
1> main.cpp
1> functions.cpp
1> faculty.cpp
1> Generating Code...
1>functions.obj : error LNK2005: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,struct Address)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@UAddress@@@Z) already defined in faculty.obj
1>functions.obj : error LNK2005: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,struct Name)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@UName@@@Z) already defined in faculty.obj
1>main.obj : error LNK2005: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,struct Address)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@UAddress@@@Z) already defined in faculty.obj
1>main.obj : error LNK2005: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,struct Name)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@UName@@@Z) already defined in faculty.obj
1>person.obj : error LNK2005: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,struct Address)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@UAddress@@@Z) already defined in faculty.obj
1>person.obj : error LNK2005: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,struct Name)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@UName@@@Z) already defined in faculty.obj
1>student.obj : error LNK2005: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,struct Address)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@UAddress@@@Z) already defined in faculty.obj
1>student.obj : error LNK2005: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,struct Name)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@UName@@@Z) already defined in faculty.obj
1>C:\Users\Fluzzarn\Documents\Visual Studio 2012\Projects\pa1\Debug\pa1.exe : fatal error LNK1169: one or more multiply defined symbols found
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:02.24
все файлы cpp включают только мой «header.h», который сам включает все остальные заголовки.
header.h:
#ifndef HEADER_H
#define HEADER_H#include "person.h"#include "faculty.h"#include "student.h"#include <iostream>
#include <fstream>
#include <list>
#include <sstream>
using namespace std;
bool searchForUser();
void loadFromFile(std::string fileName, std::list<Person> targetList);
void loadBasicInfo(std::fstream& fileReader,Person tempPerson);
#endif
Я работаю над попыткой решить эту проблему более часа, и любое понимание будет оценено
РЕДАКТИРОВАТЬ:
перегруженный <<
std::ostream& operator<<(std::ostream& os,const Address ad)
{
os << ad.mStreetAddress << std::endl;
os << ad.mCity << " , " << ad.mState << std::endl;
os << ad.mZip;
return os;
};
Адрес является структурой
Вы помещаете определения функций в .cpp-файлы, как сказано в комментариях. Чтобы предотвратить ошибку «оператор не найден», вы должны сохранить объявление функции в заголовочном файле:
std::ostream& operator<<(std::ostream& os,const Address ad);
Не забывайте точку с запятой в конце строки. И обратите внимание, что объявление содержит только заголовок функции и не содержит тела.
И ты должен пройти ad
в качестве ссылки, но это лишь незначительная деталь, которая не имеет ничего общего с вашей проблемой.
Других решений пока нет …