首页 >后端开发 >C++ >为什么在将模板化 C 类实现分成 .hpp 和 .cpp 文件时会出现未定义的引用?

为什么在将模板化 C 类实现分成 .hpp 和 .cpp 文件时会出现未定义的引用?

Barbara Streisand
Barbara Streisand原创
2024-12-28 05:48:15841浏览

Why Do I Get Undefined References When Separating Templated C   Class Implementations into .hpp and .cpp Files?

将模板化 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn