引用来自C ++标准库:教程和手册: (该链接需要谷哥)
目前使用模板的唯一可移植方法是通过使用内联函数在头文件中实现模板。
为什么是这样?
(澄清:头文件不是唯一的可移植解决方案。但是它们是最方便的可移植解决方案。)
问题来源:stackoverflow
警告:没有必要把在头文件中实现它,这个答案的末尾有替代解决方案。
无论如何,您的代码失败的原因是:在实例化模板时,编译器会使用给定的模板参数创建一个新类。例如:
struct Foo
{
T bar;
void doSomething(T param) {/* do stuff using T */}
};
// somewhere in a .cpp
Foo<int> f;
阅读此行时,编译器将创建一个新类(我们称之为FooInt
),其等效于以下内容:
{
int bar;
void doSomething(int param) {/* do stuff using int */}
}
因此,编译器需要访问方法的实现,以使用模板参数(在本例中为int
)实例化它们。 如果不在头文件中实现,则将无法访问它们,因此编译器将无法实例化模板。
常见的解决方案是将模板声明写入头文件中,然后在实现文件(例如.tpp)中实现该类,并在头末尾包含该实现文件。
Foo.h
struct Foo
{
void doSomething(T param);
};
#include "Foo.tpp"
Foo.tpp
void Foo<T>::doSomething(T param)
{
//implementation
}
用这种方式,实现仍与声明分开,但编译器可以访问。
另一个解决方案是使实现分离,并显式实例化您需要的所有模板实例:
Foo.h
template <typename T> struct Foo { ... };
Foo.cpp
// 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。
回答来源:stackoverflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。