在派生类模板中专门化基类的成员函数

时间:2013-05-10 00:48:19

标签: c++ templates specialization

看一下这段代码:

struct foo {
    virtual int bleh() {
        return 42;
    }
};


template<typename T>
struct bar : public foo {

};

// ERROR
template<>
int bar<char>::bleh() {
    return 12;
}

我正在尝试仅为base::bleh提供bar<char>的定义,但编译器(gcc 4.7.2)rejects我的代码具有以下诊断:

template-id ‘bleh<>’ for ‘int bar<char>::bleh()’ does not match any template declaration

似乎base::bleh隐藏在bar中。我已使用bar中的以下定义修复此问题:

template<typename T>
struct bar : public foo {
    // doesn't work
    //using foo::bleh; 

    // this works
    int bleh() {
        return foo::bleh();
    }
};

但我很好奇为什么这不能编译。为什么编译器会拒绝我的代码?

1 个答案:

答案 0 :(得分:4)

在你的非编译示例中,你试图专门化并定义一个尚未在bar的模板定义中声明的函数...在后面的例子中,你实际上已经声明了在bar的模板定义中定义了函数的非专用版本,这就是它编译的原因。据我所知,这里是标准中关于为什么第一个版本无法编译的相关语言(14.7.3 / 4):

  

成员函数,成员函数模板,成员类,a   成员枚举,成员类模板或静态数据成员   类模板可以明确地专门用于类   隐式实例化的专业化;在这种情况下,   类模板的定义应在显式之前   类模板成员的专门化