看一下这段代码:
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/