根据将C++模板函数定义存储在.CPP文件中的说法,分离模板类的接口和实现非常容易。
.h文件:
我们从这个类中派生出一个具体的类:
这个类的源文件看起来像这样: .cpp文件
template<typename T>
class foo
{
public:
foo();
~foo();
void do(const T& t);
};
.cpp 文件
template <typename T>
void foo::foo()
{
// initiate
}
//destructor
template <typename T>
void foo::do(const T& t)
{
// Do something with t
}
void foo<int> fi;
void foo<std::string> fs;
技巧就是通过在.cpp文件的末尾创建实例来专门化模板类。
但如果这是一个纯虚拟模板类呢?
.h 文件
template<typename T>
class foo
{
public:
foo();
~foo();
virtual void do(const T& t) = 0;
};
我们从这个类中派生出一个具体的类:
template<typename T>
class foobar : public foo<T>
{
public:
void do(const T& t);
};
这个类的源文件看起来像这样: .cpp文件
template <typename T>
void foobar::do(const T& t)
{
// Do something with t
}
void foobar<int> fi;
void foobar<std::string> fs;
而foo的源文件看起来一样,只是初始化被删除了(因为现在foo是一个抽象类)。
但现在有一个链接器错误;在foobar<int>
的构造函数中无法解析foo<int>()
。这可以通过将foo的构造函数和析构函数从源文件移回头文件中来解决。
那么我的问题是,我们如何创建抽象模板基类并将模板类的定义隐藏在源文件中?
foo<T>
是否链接? - Marcelo Cantos