我知道把你所有的模板代码放在头文件中的传统智慧,“它就是工作”。
然而,我是一个非常喜欢干净漂亮的头文件的粉丝。我想知道是否有一种方法可以在任意模板的头文件中有声明,在cpp文件中有定义。
我特别不能让它在拥有可变模板和非模板化静态成员函数的类的情况下工作。
从我能用“普通”模板化类得出的结论是:
//in header
template<int bar>
class foo
{
void member_method();
};
//in cpp
template<int bar>
void foo<bar>::member_method()
{
...
}工作得很好,但是我想不出一种方法来完成以下工作:
//in header
template<int bar, int... args>
class foo
{
void member_method();
};
//in cpp
template<int bar, int args>
void foo<bar, args...>::member_method()
{
...
}这是我的具体案例:
//in header
namespace awmms
{
template<typename T, size_t num_segments, size_t, int chunking_stratagy, int... chunk_storage_sizes>
class chunk_allocator
{
public:
...
private:
static void chunk(const int& segment);
...
};
}
//in cpp
namespace awmms
{
template<typename T, size_t num_segments, size_t, int chunking_stratagy, int... chunk_storage_sizes>
void chunk_allocator<T, num_segments, chunking_stratagy, chunk_storage_sizes...>::chunk(const int& segment)
{
...
}
}这将生成以下编译器错误:
/home/ebony/git/Ebony-Ayers/awmms/src/awmms.cpp:34:115: error: invalid use of incomplete type ‘class awmms::chunk_allocator<T, num_segments, chunking_stratagy, chunk_storage_sizes ...>’
34 | void chunk_allocator<T, num_segments, chunking_stratagy, chunk_storage_sizes...>::chunk(const int& segment)
| ^对这个例子的任何帮助,或者对模板的异想天开的世界的洞察,我们都会非常感激。
发布于 2021-07-16 22:07:21
您必须考虑编译器必须做些什么。编译器必须生成代码,它将在您使用模板时生成代码,而不是在您声明模板时生成代码。如果您将实现隐藏在一个.cpp文件中,那么就没有办法为特定用途生成该代码。
如果您的模板化类继承自未模板化的基类,那么您至少可以在基类中完成模板类的部分工作。这种方法只能让你走到这一步,而且可能远远达不到你想要的程度。
换句话说,您可以创建第二个include文件并将其命名为您想要的任何名称,但它必须以某种方式包含在您实际使用模板化类的任何位置。所以即使它不是一个.h文件,它仍然是一个包含文件。
https://stackoverflow.com/questions/68408831
复制相似问题