我创建了2个头文件。 ListA.h和ListN.h
他们都自己使用自己独特的List类。当我编译我的程序时(即使他们无法知道另一个存在,它会说明以下错误)ListA.h
#ifndef __LISTA_H_
#define __LISTA_H_
#include <iostream>
using namespace std;
class List{
public:
List(int = 0);
List(const List&);
~List();
};
#endif
ListN.h
#ifndef __LISTN_H_
#define __LISTN_H_
#include <iostream>
using namespace std;
class List{
public:
List(int = 10);
List(const List&);
~List();
};
#endif
ListA.cpp
#include "ListA.h"
using namespace std;
List::List(int mySize)
{
//...
}
ListN.cpp
#include "ListN.h"
#include <iostream>
using namespace std;
List::List(int size)
{
//...
}
主要
#include <iostream>
#include "ListN.h"
using namespace std;
int main()
{
List myList;
return 0;
}
答案 0 :(得分:0)
当尝试链接的链接器找到List的定义/符号时,它确实在两个不同的obj文件中找到,因此链接器提供者错误。在visual studio错误号:LNK2005
要解决此错误,请执行以下操作之一:
<强> ListN.h 强>
#ifndef __LIST_H_ #define __LIST_H_ #include <iostream> using namespace std; namespace ListN { class List{ public: List(int = 10); List(const List&); }; } #endif
<强> ListN.cpp 强>
#include "ListN.h" #include <iostream> using namespace std; namespace ListN { List::List(int size) { //... } }
<强> Main.cpp的强>
#include <iostream> #include "ListN.h" int main() { ListN::List myList; return 0; }
答案 1 :(得分:0)
两个cpp文件都由编译器编译。因此,当链接器将文件链接在一起时,它会变得混乱,因为有多个List
类。
要解决此问题,您可以使用命名空间,或者不要至少公开其中一个List
类。
或者,如果想要将 ListN.h 与 ListA.h 包含在内以进行配置,则这是错误的方法。您应该为标头添加#define
参数,或者您应该找到其他方式,例如通过#ifdef
。例如(我不确定这会编译,但你明白了):
<强> List.h 强>
#ifndef __LIST_H_
#define __LIST_H_
#ifndef LIST_PARAM
#define LIST_PARAM 0
#endif
#include <iostream>
using namespace std;
class List{
public:
List(int = LIST_PARAM);
List(const List&);
~List();
};
#endif
<强>的main.cpp 强>
#include <iostream>
#define LIST_PARAM 10
#include "List.h"
using namespace std;
int main()
{
List myList;
return 0;
}
我个人不喜欢这种方法;将值传递给构造函数会好得多:
int main()
{
List myList{ 10 };
return 0;
}