在cpp文件的匿名命名空间中使用模板函数是否合适?

时间:2017-09-14 22:28:48

标签: c++

我希望在cpp文件的匿名命名空间内有一个模板函数,纯粹作为不同大小的std :: array类型的辅助函数。此功能不能在此翻译单元之外的任何地方使用。

令我惊讶的是,当我在MSVC 14.1(简化代码)中尝试它时,它立刻就解决了:

namespace
{

template<std::size_t SIZE>
bool isPushed(std::uint32_t id, std::array<std::uint32_t, SIZE>& states)
{
    if(id >= states.size())
    {
        return false;
    }

    return ((states[id] & 32U) > 0U);
}

}

这是否符合C ++标准?

据我所知,模板总是需要在标题中声明(通常也是实现),为什么不在这种情况下呢?

1 个答案:

答案 0 :(得分:5)

  

这是否符合C ++标准?

绝对

  

据我所知,模板总是需要在标题中声明(通常也是实现),为什么不在这种情况下呢?

只有在多个翻译单元中使用模板(读取.cpp文件)时才会出现这种情况。有一些方法可以使用extern template在.cpp文件中实现模板。请参阅https://msdn.microsoft.com/en-us/library/by56e477.aspx

但是,当它仅在一个.cpp文件中使用时,可以在.cpp文件中定义它。

其他信息,以回应OP的评论

来自https://timsong-cpp.github.io/cppwp/n3337/temp#4

  

模板名称具有链接。

来自https://timsong-cpp.github.io/cppwp/n3337/basic.link#2.2

  

- 当名称具有内部链接时,其表示的实体可以通过同一翻译单元中其他范围的名称来引用。

来自https://timsong-cpp.github.io/cppwp/n3337/basic.link#4

  

未命名的命名空间或在未命名的命名空间中直接或间接声明的命名空间具有内部链接。所有其他名称空间都有外部链接。如果名称为

,则具有未在上面给出内部链接的命名空间范围的名称与封闭命名空间具有相同的链接      

...

     

- 模板。

从上面我们可以得出结论isPushed有内部联系。它只能在翻译单元中引用。