C ++ & lt; & lt; перегрузка с ostream для правильного форматирования

Я начал играть с кодированием моего собственного списка ссылок, он отлично работает для печати чисел, но я использую шаблоны, чтобы определить имя типа для использования с объектами. Таким образом, у меня нет проблем с вводом данных, кроме печати объектов. Я получаю следующую ошибку с этими классами, но Visual Studio 2010 не дает номер строки. Все, что я пытаюсь сделать, это разрешить вывод различных типов объектов из списка ссылок с правильным форматированием.

error LNK2005: "class std::basic_ostream<char,struct std::char_traits<char> > &
__cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,
class Customer &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@AAVCustomer@@@Z)
already defined in Customer.obj

Gui Class

//Templates
#include "LinkList.h"#include "Node.h"
//Classes
#include "Gui.h"#include "Customer.h"
//Libaries
#include <iostream>

//Namespaces
using namespace std;

int main(){
Customer c1("TempFirst", "TempLast");
LinkList<Customer> customerList;
customerList.insert(c1);

//Print Linklist
customerList.print();
system("pause");
return 0;
}

Класс клиента

//Def
#pragma once

//Included Libaries
#include <string>
#include <iostream>
class Customer
{
private:
std::string firstName;
std::string lastName;
public:
Customer();
Customer(std::string sFirstName, std::string sLastName);
~Customer(void);

//Get Methods
std::string getFirstName();
std::string getLastName();

//Set Methods
void setFirstName(std::string sFirstname);
void setLastName(std::string sLastname);

//Print
};

std::ostream& operator << (std::ostream& output, Customer& customer)
{
output << "First Name: " << customer.getFirstName() << " "<< "Last Name: " << customer.getLastName() << std::endl;
return output;
}

1

Решение

Осторожно, поместив определения функций в заголовочный файл. Вам нужно либо включить определение, либо, что еще лучше, поместить его в .cpp файл вместо. В Customer.h просто поместите прототип функции:

// Customer.h
std::ostream& operator << (std::ostream& output, Customer& customer);

И положить полное определение в Customer.cpp:

// Customer.cpp
std::ostream& operator << (std::ostream& output, Customer& customer)
{
output << "First Name: " << customer.getFirstName() << " "<< "Last Name: "  << customer.getLastName()  << std::endl;
return output;
}

Кроме того, если вы действительно хотите, чтобы определение в заголовочном файле, то добавьте inline ключевое слово. Встроенные определения должны идти в заголовочных файлах, и по своей природе они не имеют внешних связей и не будут вызывать повторяющихся ошибок определений.

inline std::ostream& operator << (std::ostream& output, Customer& customer)
{
...
}
3

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

Вы не получаете номер строки, потому что ошибка не обнаружена до
время ссылки, и компоновщик не видит никакого исходного кода. Проблема в
что вы поместили определение функции в заголовок; это только
допустимо, если функция является шаблоном функции или была объявлена
inline, Обычная процедура состоит в том, чтобы поместить только декларацию в
заголовок и поместите определение в тот же исходный файл, что и класс
определения функций-членов.

0

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