C++ 函数模板,体系结构的 undefined symbol

标签 c++ templates

<分区>

有人可以向我解释为什么以下代码无法编译吗?希望是我错过的显而易见的事情......

函数.hpp:

template<typename T> string vector_tostr(std::vector<T> v);

函数.cpp:

template<typename T> string vector_tostr(std::vector<T> v){
    std::stringstream ss;
    std::string thestring = "";
    if(v.size() > 0){
        ss << "[";
        for(size_t i = 0; i < v.size(); i++){
            if(i != 0)
                ss << " ";
            ss << v[i];
        }
        ss << "]";
        thestring = ss.str();
    }
    return thestring;
}

main.cpp

#include "functions.hpp"
int main(int argc, char *argv[]){
   vector<int> thevector;
   thevector.push_back(1);
   thevector.push_back(2);

   string result = vector_tostr(thevector);
   //I have also tried vector_tostr<int>(thevector)
}

我得到的神秘错误如下:

Undefined symbols for architecture x86_64: "std::basic_string, std::allocator > vector_tostr(std::vector >)", referenced from: _main in main.o ld: symbol(s) not found for architecture x86_64 collect2: error: ld returned 1 exit status make: * [main] Error 1

最佳答案

您不能像处理普通函数那样分离模板函数的声明和定义(在“.hpp”文件中声明,在“.cpp”文件中定义)。有几种方法可以解决这个问题。

您可以在头文件中的同一位置声明和定义函数。

您可以在名为 functions.inl 的文件中尝试这样做:

template<typename T> 
inline string vector_tostr(std::vector<T> v){
    std::stringstream ss;
    std::string thestring = "";
    if(v.size() > 0){
        ss << "[";
        for(size_t i = 0; i < v.size(); i++){
            if(i != 0)
                ss << " ";
            ss << v[i];
        }
        ss << "]";
        thestring = ss.str();
    }
    return thestring;
}

然后,在头文件 (functions.hpp) 的末尾,键入:

#include "functions.inl"

.inl 是内联头文件的文件扩展名。您可以使用它来分隔声明 和模板函数的定义。

关于C++ 函数模板,体系结构的 undefined symbol ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23862337/

相关文章:

c++ - 使用左移运算符将 F 转换为 FF

javascript:从浏览器和 node.js 中的 javascript 代码调用 C++ 库?

c++ - 基本类型的 std::vector 的部分类模板特化

javascript - Angular 1 将数据绑定(bind)到脚本模板

C++ 有没有办法获取模板类型?

c++ - 为什么用户定义的转换没有在调用对象上隐式发生

c++ - Boost C++ 进程间

c++ - 如何让 clang-format 在 Visual Studio 中工作

c++ - 令人困惑的部分模板特化

c++ - 为可变参数模板中给定的所有类型添加模板特化