出于可读性的原因,我想专门化一个函数模板,该函数模板接近在命名空间内声明的类的定义:
#include <iostream>
template<typename T> void my_function() {
std::cout << "my_function default" << std::endl;
}
namespace Nested {
class A {};
template<> void my_function<A>() {
std::cout << "my_function specialization for A" << std::endl;
}
}
但是,使用上面的代码我从clang ++ 4.0中得到以下错误:
error: no function template matches function template specialization 'my_function'
这似乎是一个命名空间问题。如何才能使上述工作正常工作(不移动Nested
命名空间中的模板函数专业化?)
编辑:我还尝试在专业化中添加::my_function
:
test.cpp: error: definition or redeclaration of 'my_function' cannot name the global scope
template<> void ::my_function<A>() {
~~^
答案 0 :(得分:3)
这是不可能的,专业化必须与模板本身位于同一名称空间中:
14.7.3显式专业化[temp.expl.spec]
2 应在包含专用模板的命名空间中声明显式特化。一个明确的 声明者id或类头名不合格的专业化应在最近的附件中声明 模板的命名空间,或者,如果命名空间是内联的(7.3.1),则来自其封闭命名空间的任何命名空间 组。这样的声明也可以是一个定义。如果声明不是定义,则专业化可以 稍后定义(7.3.1.2)。
所以你必须像这样重写你的代码:
namespace Nested {
class A {};
} // namespace Nested
template<> void my_function<Nested::A>() {
std::cout << "my_function specialization for A" << std::endl;
}