在cpp文件的匿名名称空间中具有模板功能是否合适?

Ide*_*ent 3 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);
}

}
Run Code Online (Sandbox Code Playgroud)

这符合C ++标准吗?

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

R S*_*ahu 5

这符合C ++标准吗?

绝对。

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

仅当模板在多个翻译单元(读取的.cpp文件)中使用时,多数情况下才如此。有一些方法可以使用.cpp文件实现模板extern template。请参阅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具有内部联系。只能在翻译单元中引用。