类模板特殊成员函数显式专用化



在 c++ iso 2003/2011 [temp.expl.spec]/4 中写道

类模板的成员函数、成员类或静态数据成员可以显式专用于隐式实例化的类专用化;在这种情况下,类模板的定义应在声明类模板成员的显式专用化时在范围内。如果类模板成员的这种显式专用化命名了隐式声明的特殊成员函数(子句 12),则程序格式不正确。

因此,据我所知,允许专业化的特殊功能应该在明确的专业化之前定义。

template <typename T>
class A
{
public:
    A()
    { /* some definition */}
};
template <>
A<int>::A()
{ /*explicit specialization def body*/} // this is OK

template <typename T>
class B
{};
template <>
B<int>::B()
{ /*explicit specializationdef body */} // this is forbidden by ISO c++
                                        // and when compiling with VS2013 gives compile error
                                        // cannot define a compiler-generated special member
                                        // function (must be declared in the class first)

有这种限制的原因是什么?

它与成员函数的定义正常工作的方式一致。您只能定义首先声明的函数。例如,这不会编译:

struct B {
};
B::B() {
}

构造函数是隐式声明的,因此无法显式定义。

您引用的段落说,这对于模板专业化也是如此。

相关内容

  • 没有找到相关文章

最新更新