通常,当您编写模板类并在该类中具有函数的特化时,您需要将特化放在.cpp文件中,因为它是具体的定义(而不是模板定义)。如果你只有一个很小的功能来专攻,虽然这有点烦人,有时候你可能会忘记在那个.cpp文件中找到最后一个可能导致混淆的定义。
在这样的情况下,将头文件中的一个特化包含在模板定义的其余部分中会很好。是否有任何技巧可以实现这一目标?
答案 0 :(得分:6)
使用inline
关键字:
template <unsigned N>
unsigned get_const()
{
return N;
}
template <>
inline unsigned get_const<42>()
{
throw "meaning of life";
}
关键字表示应假设多个定义相同,因此不是错误。 (这与static
正交,它在自己的翻译单元中保留重复定义。)
请注意,这适用于所有功能,而不仅仅是模板或专业化。
答案 1 :(得分:1)
您可以将特化区域包含在空namespace
中,但这可能会导致它们在不同的命名空间中定义。然后,您可以在空命名空间中创建对这些特化typedef
的别名。