看一下这段代码:

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

但是我很好奇为什么无法编译。为什么编译器拒绝我的代码?

最佳答案

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

关于c++ - 在派生类模板中专门处理基类的成员函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16473499/

10-10 21:21