好的,所以我有一个函数,它接受一个字符串并以特定的方式将其转换为一个向量。代码是:
std::vector<std::string> delimit_string(std::string s, std::string delimiter) {
std::vector<std::string> outVector;
size_t pos = 0;
std::string token;
while ((pos = s.find(delimiter)) != std::string::npos) { //thx http://stackoverflow.com/questions/14265581/parse-split-a-string-in-c-using-string-delimiter-standard-c
token = s.substr(0, pos);
outVector.push_back(token);
s.erase(0, pos + delimiter.length());
}
return outVector;
}
std::vector<std::string> parse_map(std::string map, SDL_Renderer* ren) {
std::vector<std::string> mapString = delimit_string(map, "^");
for (int i = 0; i < mapString.size(); ++i) {
size_t pos;
while ((pos = mapString[i].find("|")) != std::string::npos){ //search for a string "|" or exit if it isnt found
mapString[i].erase(pos, pos);
std::string string1 = mapString[i].substr(0, pos); //from pos to beginning
std::string string2 = mapString[i].substr(pos + 1, std::string::npos); //from pos+1 to end
mapString.erase(mapString.begin() + i);
mapString.insert(mapString.begin() + i, string2);
mapString.insert(mapString.begin() + i, "|");
mapString.insert(mapString.begin() + i, string1);
}
}
//now mapstring looks somewhat like this:
//[commoner.bmp, commoner.bmp, |, commoner.bmp, commoner.bmp]
return mapString;
}
如果我传递类似"hello.bmp^hello.bmp|hello.bmp"
的内容,它应该返回一个看起来有点["hello.bmp", "hello.bmp", "|", "hello.bmp"]
虽然编译时函数错误没有返回,但是这个(相当难以理解的)错误:
Error 1 error LNK2019: unresolved external symbol "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 parse_map(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?parse_map@@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@@Z) referenced in function _SDL_main C:\Users\spng453\documents\visual studio 2013\Projects\loot\loot\main.obj loot
我知道,通过消除过程,parse_map
函数是在编译时导致错误的函数,这可能是由于我不知道向量是如何工作的。任何帮助将不胜感激
答案 0 :(得分:2)
仔细看看你得到的错误:
unresolved external symbol "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 parse_map(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)"
简化,即
unresolved external symbol "class std::vector<class std::string> __cdecl parse_map(class std::string)"
请注意,没有提及SDL_Renderer *
参数。这意味着您可能在其他地方(可能在头文件中?)声明了此函数,并声明它没有第二个SDL_Rendered *
参数。确保所有声明都与定义匹配并重新构建所有代码。
答案 1 :(得分:1)
这通常发生在您的函数声明(原型)和定义(实现)不匹配时;编译器假定原型中声明的函数在别处定义,因此只在链接时捕获错误。
您可以从错误消息中轻松看到这一点:链接器正在寻找这样的函数:
std::vector<std::string > parse_map(std::string)
(您将std::basic_string< ... lots of stuff ...>
替换为std::string
后获得此项,std::vector<std::string> parse_map(std::string map, SDL_Renderer* ren)
是一个类型的默认设置
,而您的实施是:
{{1}}