caffe如何将模板类代码拆分为cpp和hpp文件?

时间:2017-06-15 14:47:34

标签: c++ templates caffe

我正在阅读caffe代码并发现它将C ++类模板代码拆分为hpp和cpp文件。例如,Net.cpp包含模板类Net实现代码,Net.hpp包含定义。但我记得不可能将模板类拆分为hpp和cpp文件,caffe如何使其工作? 谢谢。

2 个答案:

答案 0 :(得分:0)

如你所述,template definitions cannot be split up as easily from the declarations没有跳过一些箍。

一种常见的模式是将它们分解为人类阅读器的不同文件,但实质上它们仍然在一个标题中全部定义。例如

<强> foo.h中

#pragma once
template <typename T>
void Foo();  // declaration

#include "Foo.inl"

<强> Foo.inl

template <typename T>
void Foo()
{
    // actual definition
}

请注意,.h文件中的最后一件事实际上是包含.inl文件的完整内容。就编译器而言,所有模板定义都包含在标头中,以解决您提到的初始问题。但对于人类读者来说,声明和定义是分开的。

答案 1 :(得分:0)

你不能“通常”分开模板定义和减速。当编译器实例化模板时,它需要准确地知道上下文中使用的成员的定义和声明。因此,如果您只包含头文件,则编译器不知道如何为模板参数实例化模板。

除了coryKramer提到的解决方案之外的解决方案是在完整定义之后(在.cpp文件中)显式实例化您需要的模板参数的模板,这样模板已经实例化了您想要的值使用(此时我们有完整的declration和模板的定义)。但请注意,如果需要为其他值实例化模板,则可能会遇到错误,因为如果模板未在该文件中完全定义,编译器不知道如何执行此过程!

这是通过.cpp文件末尾的INSTANTIATE_CLASS(Net)宏在caffe中使用的方法。