3

‘m_t’ was not declared in this scope以下のコードで、 TB は問題ないのに、T2 がこのエラーを出すのはなぜですか?

また、テンプレートを使用しながら、T2 で T1 のメンバーにアクセスするにはどうすればよいですか?

// All good
class TA
{
    public:
      TA() {}

    protected:
    int m_t;
};

class TB : public TA
{
    public:
      TB() {}

      int get()
      { return m_t; }

    protected:
};

// Error in T2
template<typename T>
class T1
{
    public:
      T1() {}

    protected:
    int m_t;
};

template<typename T>
class T2 : public T1<T>
{
    public:
      T2() {}

      int get()
      { return m_t; }

    protected:
};
4

1 に答える 1

7

this->m_t従属名にするために使用する必要があります。テンプレートがコンパイルされると、名前は 2 段階で検索されます。非依存の名前は、コンパイラが最初にテンプレートを解析するときに検索されます。依存名は、テンプレートがインスタンス化されるときに検索されます。これを変更すると、関数が実際にインスタンス化this->m_tされるまでルックアップが遅延されます。この場合、基底クラスの型がわかっているため、コンパイラはメンバーの存在を確認できます。get

于 2013-05-07T13:14:18.953 に答える