我正在阅读caffe代码并发现它将C ++类模板代码拆分为hpp和cpp文件。例如,Net.cpp包含模板类Net实现代码,Net.hpp包含定义。但我记得不可能将模板类拆分为hpp和cpp文件,caffe如何使其工作? 谢谢。
答案 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中使用的方法。