c++类模板为什么不能编译到动态库中来使用

📅 2026/7/6 20:55:52
c++类模板为什么不能编译到动态库中来使用
因为模板无法编译到动态库中只有模板的实例才会被编译只是一个类模板不会被编译。只是模板无法触发编译。在使用c的时候我们习惯于将类的定义声明在头文件中即.h文件将类函数的实现定义在源文件中即.cpp文件。如果我们要提供的是一个动态库那么这种方式更常用使用动态库的时候包含头文件编译的时候链接动态库就可以了。类模板的声明和实现都需要放到头文件中。如果我们提供的是类模板这种方式就不适用了本文分析原因。1模板类错误用法t.htemplate typename T class Box { public: // 构造函数 Box(T value); // 获取值 T getValue() const; // 设置值 void setValue(T value); private: T value_; };t.cpp#include t.h // 每个函数都要声明为模板 template typename T BoxT::Box(T value) : value_{value} {} template typename T T BoxT::getValue() const { return value_; } template typename T void BoxT::setValue(T value) { value_ value; }main.cpp#include t.h #include iostream int main() { Boxint b{100}; std::cout b.getValue() std::endl; return 0; }1t.h中声明了模板类Box但是没有实现2t.cpp中实现了Box的每个函数3t.h和t.cpp通过命令g -fPIC --shared t.cpp -o libtemplate.so编译出动态库4main.cpp中使用了模板类编译main.cpp的时候通过g main.cpp libtemplate.so链接动态库在编译的时候会报错错误信息如下提示没有Boxint这个类这是为什么呢这是c语言常用的使用方式啊为什么编译会报错呢通过objdump -tT libtemplate.so查看动态库中的符号发现动态库中没有模板类的任何信息所以编译main的时候编译失败也可以解释了。但是为什么动态库中没有模板类的任何信息呢因为g编译器在编译的时候只有遇到模板的实例才会做真正的编译如果只有一个模板没有实例编译器是不会编译的。2模板类正确用法在使用类模板的时候在编译的时候要能找到类的实现才可以找不到的类的实现那么实例化就无从谈起所以会编译失败。一般在使用类模板的时候类的实现和声明要放在同一个文件中一般都放在头文件中。模板只是简化了代码的数量编译成二进制之后模板就不存在了编译之后都是实例化的类。