3

在下面的代码中,为什么 T2 会给出这个错误‘m_t’ was not declared in this scope,而 TB 很好?

以及如何在仍然使用模板的同时访问 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它来使其成为从属名称。编译模板时,将分两个阶段查找名称。编译器第一次解析模板时会查找非依赖名称。实例化模板时查找从属名称。将其更改为this->m_t延迟查找直到get函数实际实例化之后,在这种情况下,基类类型是已知的,编译器可以验证成员的存在。

于 2013-05-07T13:14:18.953 回答