从模板子类调用模板基类的重写模板成员函数
Calling overridden template member function of template base class from template subclass
考虑以下示例
template <class T>
struct Foo
{
template <class U> void f (void) {}
void g (void) {}
};
struct Foo2
{
template <class U> void f (void) {}
void g (void) {}
};
template <class T>
struct Bar : public Foo<T>, public Foo2
{
template <class U>
void f (void) {
Foo<T>::f<U> (); // doesn't compile
Foo2::f<U> (); // compiles
}
void g (void) {
Foo<T>::g (); // compiles
Foo2::g (); // compiles
}
};
struct Bar2 : public Foo<char>, public Foo2
{
template <class U>
void f (void) {
Foo<char>::f<U> (); // compiles
Foo2::f<U> (); // compiles
}
void g (void) {
Foo<char>::g (); // compiles
Foo2::g (); // compiles
}
};
int main()
{
Bar<char> b;
b.f<int> ();
b.g ();
Bar2 b2;
b2.f<int> ();
b2.g ();
return 0;
}
在这两种继承情况下,模板成员函数f
在子类Bar
和Bar2
中被覆盖。当基类不是模板时,可以从子类调用被重写的方法。当基类是模板而子类不是模板时,相同。但是,当基类和子类都是模板时,基类的重写模板成员函数不能从子类中调用。具体来说,g++-4.8吐出:
In member function ‘void Bar<T>::f()’:
error: expected primary-expression before ‘>’ token
Foo<T>::f<U> (); // doesn't compile
^
error: expected primary-expression before ‘)’ token
Foo<T>::f<U> (); // doesn't compile
^
我的问题是:这是预期行为吗?
这里f<U>
是一个依赖名称(它取决于T
),所以您需要消除它是一个模板的事实:
Foo<T>::template f<U>();
相关文章:
- 在 C++ 中用派生类型重写成员函数
- 将方法委托给成员的重写运算符>
- 继承类中的 C++ 成员变量类型重写
- 通过运算符使用标量参数重写来修改类成员
- 重写另一个类中的虚拟方法以在 C++ 中访问其成员
- 是否可以在不重写派生类中记录虚拟成员?
- 重写C++静态常量成员
- 继承时避免重写成员
- C++子类中的重写函数成员
- 重写类成员值而不更改实际实现
- 如何重写基类成员的类型
- 可以在重写的方法中修改私有成员变量吗
- 重写派生类中的成员字段
- 如何在 QFileSystemModel 中重写(重新实现)成员函数
- 如何从重写的运算符循环访问矢量数据成员<<
- C++派生类用另一个派生类重写基类的成员
- 重写基类的成员变量的初始值
- 继承的静态函数能否访问重写的静态专用数据成员
- C++重写成员变量(std::vector)
- 重写成员对象中的函数