命名空间中的函数模板专用化
function template specialization in a namespace
我想专门化一个函数模板。此函数在命名空间中声明:
namespace foo
{
template <int>
void function();
}
(为简单起见,该模板基于int
,而在我的生产代码中,它是一个enum class
,但它是相同的问题。基于类型的模板也是如此)
现在我想针对特定值专门化它:
template <>
void foo::function<0>()
{
}
这无法使用 g++ -std=c++11
(版本 4.6、4.7、4.8 和 4.9)进行编译:
不同命名空间中的"模板无效 foo::function()"的专业化 [-permissive]
clang++ -std=c++11
接受此代码。
G++ 也接受以下部分:
namespace foo
{
template <>
void function<0>()
{
}
}
谁是对的,gcc 还是叮当?
根据标准 §14.7.3/2,强调我的:
应在包含专用模板的命名空间中声明显式专用化。一个明确的 声明符 ID不合格的专用化应在最近的封闭命名空间中声明 模板,或者,如果命名空间是内联的 (7.3.1),则为其封闭命名空间集中的任何命名空间。
你必须把template<> function<0>();
放在namespace foo
.但是,该规则仅适用于非限定声明符 ID。当您提供限定 id 时(如 foo::function<0>
),我认为该子句不应适用,这使得 clang 在这里是正确的。
例如,鉴于function
宣布了这个问题,我期望以下内容:
namespace foo {
template <> void function<0>(); // valid: unqualified explicit specialization
// in the nearest enclosing namespace of the
// template
}
namespace bar {
template <> void function<1>(); // invalid: unqualified explicit specialization
// in the wrong namespace
}
struct baz {
template <> void function<2>(); // invalid: unqualified explicit specialization
// not in namespace scope
};
template <> void foo::function<3>(); // valid: qualified explicit specialization
// is in a namespace, and id is qualified
template <> void bar::function<4>(); // invalid: there is no bar::function
// to specialize
相关文章:
- 具有常量引用参数的函数模板专用化
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- 如何减少函数模板专用化?
- 专用于类型集的函数模板
- 类成员函数的函数模板专用化
- 使用类指针重载C++命名空间函数模板专用化替代方法?
- 将 c++ 类成员函数专用于模板类
- 类和成员函数模板专用化出错
- C++ 模板化基类的函数模板专用化
- 如何使专用函数模板成为某个类的朋友?
- 函数模板(它是类模板的成员)的显式专用化会产生"partial specialization is not allowed"错误,为什么?
- 函数模板中的显式模板专用化不起作用
- C++函数模板专用化和重载
- 无法专用化函数模板'unknown-type std::invoke(_Callable &&,_Types &&...) noexcept(<expr>)'
- 函数模板专用化生成链接错误
- 视图和跨步视图以及常量噩梦的函数模板专用化
- 函数模板重载 - 部分专用化
- 64 位 G++ 4.6.3 不会在专用函数模板中将长整型视为长整型,即使它们的大小相同。这是一个错误吗?
- 为什么我不能专用函数模板?
- 专用函数模板