0
模板基類的重寫的模板構件函數考慮這個例子調用從模板子類
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
^
我的問題是:這是預期的行爲嗎?