gpt4 book ai didi

c++ - 将模板类分成多个文件会产生链接问题

转载 作者:搜寻专家 更新时间:2023-10-31 00:21:52 25 4
gpt4 key购买 nike

我在下面创建了一个示例来说明我遇到的问题。基本上,当我将模板类分离到单独的 .h/.cpp 文件中时,我得到了构造函数的未解析符号。使用单个文件,它编译得很好。这是什么原因造成的?

水果.cpp:

#include "apple.h"

class FruitsDB {
public:
void addApple();
};

void FruitsDB::addApple() {
Apple<int> m;
}

int main() {
FruitsDB fruits;
return 0;
}

苹果.h:

template <typename T>
class Apple {
public:
Apple();
~Apple();
};

苹果.cpp

template <typename T>
Apple<T>::Apple() {
}

template <typename T>
Apple<T>::~Apple() {
}

这会产生编译器错误:

g++    -c -o fruits.o fruits.cpp
g++ -c -o apple.o apple.cpp
g++ -Wall -ggdb fruits.o apple.o -o fruits
Undefined symbols:
"Apple<int>::Apple()", referenced from:
FruitsDB::addApple() in fruits.o
"Apple<int>::~Apple()", referenced from:
FruitsDB::addApple() in fruits.o
ld: symbol(s) not found

我认为是我的代码导致了问题,但合并文件并没有产生问题。我假设我需要在我不在的地方包含一个文件。我完全迷路了。

注意:添加 template <> Apple<int>::Apple() {}在 apple.cpp 中将解决这个问题,但我使用模板来避免必须编写所有这些构造函数等。

最佳答案

只需将模板函数定义放在头文件中即可。关于模板函数的事情是,它们实际上并不是函数。它们是函数的模板。所以它们不能像普通函数那样在上下文之外编译。只有在模板参数已知的情况下才能编译它们。因此,当使用它们的文件调用该函数时,编译就完成了。为了实现这一点,模板需要对调用它的文件可见,这就是将它放在标题中的原因。

关于c++ - 将模板类分成多个文件会产生链接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4011679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com