2015-09-02 96 views
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在子類中BarBar2被覆蓋。當基類不是模板時,重寫的方法可以在子類中被調用。當基類是模板但子類不相同時。但是,如果基類和子類都是模板,則不能從子類調用基類的重寫模板成員函數。具體來說,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 
        ^

我的問題是:這是預期的行爲嗎?

回答

2

這裏f<U>是一個從屬名稱(這取決於T),所以你需要消除歧義的事實,這是一個模板:

Foo<T>::template f<U>();