如何在另一个名称空间内从另一个命名空间内明确专业化功能模板



出于可读性原因,我想专业地将一个函数模板接近在命名空间内声明的类的定义:

#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>() {
                        ~~^

是不可能的,专业化必须与模板本身相同的名称空间:

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;
}

相关内容

  • 没有找到相关文章

最新更新