2011-05-17 220 views
3

你能告訴我,我錯過了什麼?模板類繼承問題

template <class T> struct Base 
{ 
    T data; 
    Base(const T &_data):data(_data) { } 
}; 

template <class T> struct Derived : Base<T> 
{ 
    Derived():Base(T()) {} //error: class 'Derived<T>' does not have any field named 'Base' 
}; 
+0

正如其他人指出的那樣,如果將'Base(T())'更改爲'Base (T())',它會進行編譯。但是有沒有人可以告訴我們這兩個編譯器中的哪一個是正確的? – TonyK 2011-05-17 09:30:46

回答

8
template <class T> struct Derived : Base<T> 
{ 
    Derived():Base<T>(T()) {} 
}; 
+0

謝謝,尼爾·巴特沃斯! – Ryan 2011-05-17 09:26:26

+0

一個很好的幫助是一個typedef的基地'typedef基地超'。 :)當你在基地有多個模板參數時,幫助很大。 – Xeo 2011-05-17 09:33:35

+0

偉大的建議,Xeo! – Ryan 2011-05-17 09:37:55

1

總還是有問題:誰是正確的?海灣合作委員會就在這裏。非限定名稱查找不查看依賴基類,因此在Base<T>範圍內找不到Base。您可以將您的代碼更改爲以下標準符合性變異太

Derived():Derived::Base(T()) {} 

如果我沒記錯的話,這隻能由GCC4.5雖然支持。早期版本沒有正確實現注入的類名查找。