gpt4 book ai didi

c++ - 为什么模板只能在头文件中实现?

转载 作者:行者123 更新时间:2023-12-03 12:51:56 24 4
gpt4 key购买 nike

引自The C++ standard library: a tutorial and handbook :

The only portable way of using templates at the moment is to implement them in header files by using inline functions.

这是为什么?

(澄清:头文件不是唯一的可移植解决方案。但它们是最方便的可移植解决方案。)

最佳答案

警告:没有必要将实现放入头文件中,请参阅本答案末尾的替代解决方案。

无论如何,您的代码失败的原因是,在实例化模板时,编译器会使用给定的模板参数创建一个新类。例如:

template<typename T>
struct Foo
{
T bar;
void doSomething(T param) {/* do stuff using T */}
};

// somewhere in a .cpp
Foo<int> f;

当读到这一行时,编译器将创建一个新类(我们称之为FooInt),它相当于以下内容:

struct FooInt
{
int bar;
void doSomething(int param) {/* do stuff using int */}
};

因此,编译器需要访问方法的实现,以使用模板参数(在本例中为 int)实例化它们。如果这些实现不在 header 中,则它们将无法访问,因此编译器将无法实例化模板。

对此的常见解决方案是将模板声明写入头文件中,然后在实现文件(例如 .tpp)中实现该类,并将该实现文件包含在头文件的末尾。

Foo.h

template <typename T>
struct Foo
{
void doSomething(T param);
};

#include "Foo.tpp"

Foo.tpp

template <typename T>
void Foo<T>::doSomething(T param)
{
//implementation
}

这样,实现仍然与声明分离,但可供编译器访问。

替代解决方案

另一个解决方案是保持实现分离,并显式实例化您需要的所有模板实例:

Foo.h

// no implementation
template <typename T> struct Foo { ... };

Foo.cpp

// implementation of Foo's methods

// explicit instantiations
template class Foo<int>;
template class Foo<float>;
// You will only be able to use Foo with int or float

如果我的解释不够清楚,你可以看看C++ Super-FAQ on this subject .

关于c++ - 为什么模板只能在头文件中实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61914225/

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