有没有办法欺骗编译器允许头文件中的模板特化?

时间:2011-09-07 20:33:04

标签: c++ templates

通常,当您编写模板类并在该类中具有函数的特化时,您需要将特化放在.cpp文件中,因为它是具体的定义(而不是模板定义)。如果你只有一个很小的功能来专攻,虽然这有点烦人,有时候你可能会忘记在那个.cpp文件中找到最后一个可能导致混淆的定义。

在这样的情况下,将头文件中的一个特化包含在模板定义的其余部分中会很好。是否有任何技巧可以实现这一目标?

2 个答案:

答案 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的别名。