C ++模板的声明和定义分离

时间:2016-03-03 03:38:47

标签: c++ templates header-files template-meta-programming

最近,我一直在使用Template Metaprogramming(使用 Modern C ++ Design 这本书作为我当前的参考书)构建个人库方面取得进展。

我一直在考虑布局模板代码的最佳方法。显然,编译器希望模板的定义在声明的同一文件中可见。但是,我想将声明与定义分开,所以当我只是想看一个方法原型或其他东西时,我不太关注。

因此,为了解决这个问题,我可以通过以下示例说明我已经开始做的事情:

SomeClass.hpp

#ifndef _someclass_hpp
#define _someclass_hpp

template<typename T>
class SomeClass {
public:
...
private:
...
};

#include "SomeClass_Implementation.hpp"

#endif

SomeClass_Implementation.hpp

#ifndef _someclass_impl_hpp
#define _someclass_impl_hpp

#include "SomeClass.hpp"

/* SomeClass Implementation... */

#endif

我个人更喜欢这一点,而不是将所有内容都放在一个文件中,但我很好奇是否有人有任何关于这个或任何可能让我考虑将其全部转储到一个文件中的推理的提示。

1 个答案:

答案 0 :(得分:0)

我喜欢的一种方法是:

Header.hpp:

#ifndef FileGuard_whatever // technically reserved by STL because
#define FileGuard_whatever // it starts with a capital letter

template <typename T>
class A
{
    void go ( T const& value ) ;
} ;

#include "Header.hxx" // implementation details

#endif // FileGuard

Header.hxx:

template <typename T>
void A<T>::go ( T const& value ) { }

这正是你所做的。我在其他文件中省略了添加文件保护,并给出一个名称,让人们知道不要导入它。

我对此感到好运。它需要人们一秒钟才能弄清楚,但.hxx至少对此有所帮助(&#34;它有所不同;好吧, 有什么不同? &#34)