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

Specializing a base class' member function in a derived class template

本文关键字:基类 成员 函数 专用 派生      更新时间:2023-10-16

看一下这段代码:

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

template<typename T>
struct bar : public foo {
};
// ERROR
template<>
int bar<char>::bleh() {
    return 12;
}

我试图为bar<char>提供base::bleh的定义,但编译器(gcc 4.7.2)拒绝我的代码,并给出以下诊断:

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

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

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

成员函数,成员函数模板,成员类成员枚举、成员类模板或静态数据成员的模板可以为类显式特化隐式实例化的专门化;在这种情况下,类模板的定义应该在显式模板之前类模板成员的专门化