Mat*_*att 3 c++ templates instantiation header-files
我想创建一个模板类(姑且称之为Foo)只接受少数特殊类型的参数(比方说只double和float).通常模板在头文件(.h)中实现,因为不知道它将如何在用户代码中实例化.在这种情况下,在实现文件(.cpp)中实现类更有意义,如下所示:
// Foo.cpp:
template <class T>
class Foo
{
// Insert members here
};
typedef Foo<double> Foo_d;
typedef Foo<float> Foo_f;
Run Code Online (Sandbox Code Playgroud)
这将在编译Foo.cpp时实例化并编译该类.但是,如何在头文件中声明这个,而不用为Foo_d和编写单独的声明Foo_f?
除非我弄错了,你所描述的正是新C++ 11 extern template功能的用例.要使用此功能,您可以将模板类的接口放在头文件中.然后,您将使用以下行结束头文件:
extern template class Foo<float>;
extern template class Foo<double>;
Run Code Online (Sandbox Code Playgroud)
这告诉包含头文件的任何文件在使用时不要尝试实例化模板.然后,在您的C++文件中,您将实现模板类,然后以行结束
template class Foo<float>;
template class Foo<double>;
Run Code Online (Sandbox Code Playgroud)
最后两行强制编译器在此转换单元中实例化模板,因此您不会收到任何链接器错误.
希望这可以帮助!
您可以在头文件中定义模板,声明方法,但不定义它们.例如:
template <typename T>
class Foo {
T val;
public:
Foo (T t);
T value ();
};
typedef Foo<double> Foo_d;
typedef Foo<float> Foo_f;
Run Code Online (Sandbox Code Playgroud)
在该.cpp文件中,您完成方法的实现,然后实例化您想要的模板.
#include "foo_template.hpp"
template <typename T>
Foo<T>::Foo (T t) : val(t) {}
template <typename T>
T Foo<T>::value () { return val; }
template class Foo<double>;
template class Foo<float>;
Run Code Online (Sandbox Code Playgroud)
目标文件应该有实例为Foo_d并Foo_f从明确的实例模板Foo.用于模板的任何其他类型Foo都将导致链接错误,因为它们的实例化将不存在.或者,更迂腐地,编译器像往常一样按需创建实例化,但是它将无法解析与类的方法相对应的符号,因为这些符号的显式实例化将不存在.
| 归档时间: |
|
| 查看次数: |
610 次 |
| 最近记录: |