我有一个使用模板的多文件项目。
// Foo.h
template <class T>
class Foo
{
T bar;
};
我有一个班级(例如Cup)和该班的一堆子类。
// Cup.h
class Cup
{
};
class Chalice : public Cup
{
};
class SippyCup : public Cup
{
};
// ...etc.
在模板的.cpp文件中,我需要列出所有可能的模板实现以避免链接器错误。我是从C++ FAQ了解到的。
//Foo.cpp
template class Foo<Cup>;
template class Foo<Chalice>;
template class Foo<SippyCup>;
// ...etc.
实际上,我有大约20多个子类,我想在我的代码中的任何一点使用它。在开发中,我不断创建新的子类。所以每次我创建一个新的,我都要将它添加到Foo.cpp
中不断增长的列表中。
这是一种痛苦。有没有办法绕过必须列出所有这些可能性?
答案 0 :(得分:4)
避免它的方法是将模板函数定义放在头文件中(即在实际模板定义中),而不是放在单独的.cpp文件中。
答案 1 :(得分:0)
没有任何模板特化的Foo类定义需要在.h文件中(或.tpp文件,如上面链接中所述)。但是,模板专用类定义需要在.cpp文件中定义,并在.h文件(或.tpp文件)中使用该类型的前向声明。因此,例如,您希望为Cup thens提供不同的模板类定义
// Foo.h
template <class T>
class Foo
{
T bar;
};
template<> class Foo<Cup>;
然后您可以在同一个头文件或不同的头文件中使用此特殊形式的模板类的不同声明。类的模板化(非特征化表示)的所有模板成员函数和构造函数都应该在.h文件(或.tpp文件)中,但Cup专用模板类的构造函数必须在.cpp文件中。避免链接器错误。此外,非专用模板类和非专用模板类的所有非模板化成员函数都必须在.cpp文件中定义(如果它们不是内联的:)。希望这有助于!!!!