在派生类模板中专用基类的成员函数
Specializing a base class' member function in a derived class template
看一下这段代码:
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)的相关语言:
成员函数,成员函数模板,成员类成员枚举、成员类模板或静态数据成员的模板可以为类显式特化隐式实例化的专门化;在这种情况下,类模板的定义应该在显式模板之前类模板成员的专门化
相关文章:
- 派生类看不到基类成员
- C++11: 如何访问派生类中的基类成员?
- Qml 未收到基类成员变量的更新值
- 指向从指针派生类成员函数的指针,指向基类成员函数
- 初始化基类成员 (c++) 的首选方法
- 访问多级复合关系中的基类成员
- 允许从特定派生类访问基类成员
- 在派生类的成员联合中包含继承的基类成员
- 由派生类设置的 constexpr 基类成员
- 从派生类调用的抽象基类成员函数
- 从抽象基类访问另一个基类成员
- C++派生类访问基类成员
- 不能引用派生模板类中的基类成员
- C2694 在析构函数上,当基类成员的析构函数具有非空 noexcept 说明符和主体时
- 在Visual Studio 2017中,通过扩展每个参数包来呼叫基类成员失败
- 在C 中访问带有不正确的下属的基类成员
- C++将基类成员链接到派生类成员
- 从基类成员函数返回派生类的实例
- 从指针到基类成员的模板推导
- 是否可以从派生类中排除基类成员?