我已经开始编写自己的链接列表,它可以正常打印数字,但我使用模板来确定用于对象的类型名称。因此,除了打印对象之外,我没有输入数据的问题。我在这些类中遇到以下错误,但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;
}
答案 0 :(得分:3)
小心将函数定义放在头文件中。您需要内联定义,或者更好的是,将其放在.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)
{
...
}
答案 1 :(得分:0)
您没有获得行号,因为直到找不到错误
链接时间,链接器没有看到任何源代码。问题是
您已将函数定义放在标题中;这只是
如果函数是函数模板或已声明,则合法
inline
。通常的程序是只在声明中
标题,并将定义放在与该类相同的源文件中
成员函数定义。