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 ::」每時間...
關於「this->」原因的常見問題解答是錯誤的。將其與標準進行比較(由我強調)。 FAQ:「由於這總是隱式地依賴於模板,因此this-> f *是相關的,因此查找會延遲*直到模板實際實例化,此時所有基類都被視爲*」,Standard:「。 ..在類模板或成員的定義點或者在類模板或成員的實例化過程中,在非限定名稱查找過程中,基類範圍*不會被檢查。「常見問題解答表示找到它是因爲它是依賴的,但這是錯誤的。 – 2010-06-06 00:49:33
GCC也實現了這個錯誤的解釋,並因此[有錯誤報告打開](http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43282) – 2010-06-06 00:56:22