2010-06-06 98 views
5

我想了解whay我在此代碼得到一個錯誤: (是在G ++ UNIX編譯器錯誤VS正在編制確定。)問題模板繼承

template<class T> class A { 
public: 
    T t; 
public: 
    A(const T& t1) : t(t1) {} 
    virtual void Print() const { cout<<*this<<endl;} 
    friend ostream& operator<<(ostream& out, const A<T>& a) { 
      out<<"I'm "<<typeid(a).name()<<endl; 
      out<<"I hold "<<typeid(a.t).name()<<endl; 
      out<<"The inner value is: "<<a.t<<endl; 
      return out; 
    } 
}; 

template<class T> class B : public A<T> { 
public: 
    B(const T& t1) : A<T>(t1) {} 
    const T& get() const { return t; } 
}; 

int main() { 
    A<int> a(9); 
    a.Print(); 
    B<A<int> > b(a); 
    b.Print(); 
    (b.get()).Print(); 
    return 0; 
} 

此代碼是給下面的錯誤:

main.cpp中:在成員函數 'const的Ť& B ::得到()const的':
main.cpp中:23:錯誤: 'T' 在此範圍內未聲明

它當我編譯時改變B的這個代碼:

template<class T> class B : public A<T> { 
public: 
    B(const T& t1) : A<T>(t1) {} 
    const T& get() const { return A<T>::t; } 
}; 

我只是無法理解什麼是第一個代碼問題...
它沒有任何意義,我真的需要寫「A ::」每時間...

回答

7

您還可以使用this->t來訪問基類模板成員。

B::get()中,名稱t不依賴於模板參數T,所以它不是依賴名稱。基類A<T>顯然依賴於模板參數T,因此是一個從屬基類。非依賴名稱不在相關的基類中查找。 A detailed description of why this is the case can be found in the C++ FAQ Lite

+2

關於「this->」原因的常見問題解答是錯誤的。將其與標準進行比較(由我強調)。 FAQ:「由於這總是隱式地依賴於模板,因此this-> f *是相關的,因此查找會延遲*直到模板實際實例化,此時所有基類都被視爲*」,Standard:「。 ..在類模板或成員的定義點或者在類模板或成員的實例化過程中,在非限定名稱查找過程中,基類範圍*不會被檢查。「常見問題解答表示找到它是因爲它是依賴的,但這是錯誤的。 – 2010-06-06 00:49:33

+1

GCC也實現了這個錯誤的解釋,並因此[有錯誤報告打開](http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43282) – 2010-06-06 00:56:22