0

我有一个使用模板的多文件项目。

// 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

这是一种痛苦。有没有办法绕过列出所有这些可能性?

4

2 回答 2

4

避免它的方法是将模板函数定义放在头文件中(即在实际的模板定义中),而不是放在单独的.cpp 文件中。

于 2013-08-23T18:33:03.017 回答
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 文件中定义,如果它们不是内联的:)。希望这可以帮助!!!!

于 2013-08-23T19:35:11.447 回答