1

看看这段代码:

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


template<typename T>
struct bar : public foo {

};

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

我试图提供base::blehonly for的定义bar<char>,但编译器(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();
    }
};

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

4

1 回答 1

4

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

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

于 2013-05-10T01:15:34.863 回答