多重定义的符号 (C++)
Multiply defined symbols (C++)
我是新手,在我的 C++ 代码中遇到了一些非常奇怪的错误。据我所知,它们是由于多个包含错误造成的。
我有以下文件
CardBase.h
#include <string>
#include <vector>
#include <map>
class Class1 {
string someString;
vector<type> someVector;
map<type,type> someMap;
type someMethod (param);
}
CardBase.cpp
#include "StringParser.cpp"
someType Class1::someMethod (param){
// Use splitAtChar()
}
StringParser.cpp
#include <string>
#include <vector>
someType splitAtChar(){
...
}
这会在 VS 代码中产生两个错误:
LNK2005 "class std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > __cdecl splitAtChar(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,char)" (?splitAtChar@@YA?AV?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@D@Z) already defined in CardBase.obj
和
one or more multiply defined symbols found
是的,不要将一个 cpp 文件包含在另一个文件中。使用头文件。
CardBase.cpp
#include "StringParser.h"
someType Class1::someMethod (param){
// Use splitAtChar()
}
StringParser.cpp
#include "StringParser.h"
#include <string>
#include <vector>
someType splitAtChar(){
...
}
StringParser.h
#ifndef STRING_PARSER_H
#define STRING_PARSER_H
someType splitAtChar();
#endif
这是基本的东西,你的 C++ 书应该解释如何组织你的代码。
在你的CardBase.cpp
#include "StringParser.cpp"
someType Class1::someMethod (param){
// Use splitAtChar()
}
您正在包含一个 .cpp 文件。如果您另外编译它,那么您将定义 splitAtChar() 两次,因此会出现错误。
我是新手,在我的 C++ 代码中遇到了一些非常奇怪的错误。据我所知,它们是由于多个包含错误造成的。
我有以下文件
CardBase.h
#include <string>
#include <vector>
#include <map>
class Class1 {
string someString;
vector<type> someVector;
map<type,type> someMap;
type someMethod (param);
}
CardBase.cpp
#include "StringParser.cpp"
someType Class1::someMethod (param){
// Use splitAtChar()
}
StringParser.cpp
#include <string>
#include <vector>
someType splitAtChar(){
...
}
这会在 VS 代码中产生两个错误:
LNK2005 "class std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > __cdecl splitAtChar(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,char)" (?splitAtChar@@YA?AV?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@D@Z) already defined in CardBase.obj
和
one or more multiply defined symbols found
是的,不要将一个 cpp 文件包含在另一个文件中。使用头文件。
CardBase.cpp
#include "StringParser.h"
someType Class1::someMethod (param){
// Use splitAtChar()
}
StringParser.cpp
#include "StringParser.h"
#include <string>
#include <vector>
someType splitAtChar(){
...
}
StringParser.h
#ifndef STRING_PARSER_H
#define STRING_PARSER_H
someType splitAtChar();
#endif
这是基本的东西,你的 C++ 书应该解释如何组织你的代码。
在你的CardBase.cpp
#include "StringParser.cpp"
someType Class1::someMethod (param){
// Use splitAtChar()
}
您正在包含一个 .cpp 文件。如果您另外编译它,那么您将定义 splitAtChar() 两次,因此会出现错误。