C ++成员模板特化语法

时间:2018-04-12 09:21:03

标签: c++ templates

this site上有以下段落:

  

在类的主体外定义显式专用类模板的成员时,语法模板<>没有使用,除非它是专门作为类模板的显式专用成员类模板的成员,因为否则,语法将要求这样的定义以模板<参数>嵌套模板所需。

我不知道突出显示的部分是什么意思。是"否则"请参阅一般情况(不使用模板<>)或异常情况(必须使用模板<>)?

我很感激对该部分的解释。

1 个答案:

答案 0 :(得分:-1)

这将是我们的模板:

template< typename T>
struct A {
    struct B {};  // member class 
    template<class U> struct C { }; // member class template
};

请参阅以下代码:

template<> // specialization
struct A<int> {
    void f(int); // member function of a specialization
};
// template<> not used for a member of a specialization
void A<int>::f(int) { /* ... */ }

我们在定义专业化成员时没有使用template<>,因为这是一个普通的成员类。

但是,现在看下一个代码:

template<> // specialization of a member class template
template<class U> struct A<char>::C {
    void f();
};

// template<> is used when defining a member of an explicitly
// specialized member class template specialized as a class template
template<>
template<class U> void A<char>::C<U>::f() { /* ... */ }

此处我们专门介绍已定义模板的成员模板。这就是为什么我们需要使用template<>来传递此成员模板所需的参数。在这种情况下,需要class U来定义我们的成员模板,因此为了传递,我们需要关键字template<>