模板继承问题

ami*_*iad 5 c++ inheritance templates

我试图理解我在这段代码上得到错误:(错误是在g ++ unix编译器下.VS正在编译OK)

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;
}
Run Code Online (Sandbox Code Playgroud)

此代码提供以下错误:

main.cpp:在成员函数'const T&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; }
};
Run Code Online (Sandbox Code Playgroud)

我只是无法理解第一个代码的问题是什么...
每次我真的需要写"A ::"是没有意义的...

Jam*_*lis 7

您还可以使用this->t访问基类模板成员.

B::get(),名称t不依赖于模板参数T,因此它不是依赖名称.基类A<T>显然依赖于模板参数T,因此是依赖的基类.在从属基类中不查找非依赖名称. 可以在C++ FAQ Lite中找到为什么会出现这种情况的详细说明.

  • 常见问题是"this->"工作的原因是错误的.将它与标准进行比较(由我强调).常见问题解答:"由于这总是隐式依赖于模板,因此 - > f*是相关的,因此查询被推迟*直到模板实际被实例化,*此时所有基类都被认为是*",标准:". ..在类模板或成员*的定义点或类模板或成员的实例化*期间,在非限定名称查找期间不检查基类范围*.常见问题解答说它被发现是因为它依赖,但这是错误的. (2认同)