我试图理解我在这段代码上收到错误: (错误在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 T&amp; B :: get()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 ::”是没有意义的......
答案 0 :(得分: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