将模板化 C 类拆分为 .hpp/.cpp 文件
问题:
编译.hpp 和 .cpp 文件之间的 C 模板类拆分导致未定义的引用模板成员的错误函数。
代码:
stack.hpp:
template <typename Type> class stack { public: stack(); ~stack(); };
stack.cpp:
#include <iostream> #include "stack.hpp" template <typename Type> stack<Type>::stack() { std::cerr << "Hello, stack " << this << "!" << std::endl; } template <typename Type> stack<Type>::~stack() { std::cerr << "Goodbye, stack " << this << "." << std::endl; }
main.cpp:
#include "stack.hpp" int main() { stack<int> s; return 0; }
答案:
解释:
它将模板类的实现拆分为单独的 .cpp 文件进行编译是不可行的。头文件仅经过预处理,不包含实际代码。
编译过程:
编译时,将预处理后的头文件与.cpp 文件结合在一起。但是,对于模板类,编译器需要有关模板数据类型的信息来生成内存布局和方法定义。
单独的 cpp 文件问题:
移动方法定义到单独的cpp文件而不实例化头文件中的模板类将不会生成必要的目标文件信息。因此,链接器找不到符号,导致未定义的引用错误。
替代方法:
要将接口与实现分离,请考虑将数据结构与算法分离。模板类应该仅代表数据结构。算法可以在与模板类交互或利用模板类的单独的非模板化类库中实现。这种方法可以隐藏有价值的实现细节。
以上是为什么在将模板化 C 类实现分成 .hpp 和 .cpp 文件时会出现未定义的引用?的详细内容。更多信息请关注PHP中文网其他相关文章!