看一下这段代码:
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();
}
};
但我很好奇为什么这不能编译。为什么编译器会拒绝我的代码?
答案 0 :(得分:4)
在你的非编译示例中,你试图专门化并定义一个尚未在bar
的模板定义中声明的函数...在后面的例子中,你实际上已经声明了在bar
的模板定义中定义了函数的非专用版本,这就是它编译的原因。据我所知,这里是标准中关于为什么第一个版本无法编译的相关语言(14.7.3 / 4):
成员函数,成员函数模板,成员类,a 成员枚举,成员类模板或静态数据成员 类模板可以明确地专门用于类 隐式实例化的专业化;在这种情况下, 类模板的定义应在显式之前 类模板成员的专门化