改变向量时几乎不可读的错误

时间:2014-05-02 00:26:33

标签: c++ vector stl

好的,所以我有一个函数,它接受一个字符串并以特定的方式将其转换为一个向量。代码是:

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函数是在编译时导致错误的函数,这可能是由于我不知道向量是如何工作的。任何帮助将不胜感激

2 个答案:

答案 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}}