0

可能重复:
C++ 继承的模板类无权访问基类

我遇到了模板和继承问题。简单地说,我有一个模板类,我想要另一个模板类继承。我不明白为什么基类的成员在派生类中不可见?尽管不使用模板,但一切都按预期工作。例如:

template <typename T>
class Foo
{
public:
    T x;
    T y;
    void doX(){ x = x+1; }
    void doY(){y++;}
protected:
    T a;
    T b;
    void doA(){a++;}
};

template <typename T>
class Bar : public Foo<T>
{
public:
    void doX(){x++; y++;} // ERROR
    void doY(){x++; y++;} // ERROR
    void doA(){a++;b++;}  // ERROR
};
4

4 回答 4

8

这些变量是从属名称(有关详细信息,请阅读可怕的两阶段名称查找),因此您需要用作this

void doX(){ this->x++; this->y++; } 

通常this->不需要,因为它是隐式的。但在这里它是必需的。实际上显式this->告诉编译器在实例化基类时在第二阶段查找名称,因为这种情况下使用两阶段名称查找机制。

或者您可以使用基类将它们限定为:

template <typename T>
class Bar : public Foo<T>
{
    typedef Foo<T> base; //add this friendly typedef!
public:
    void doX(){  base::x++; base::y++;} 
    //...
};

在这种情况下,在我看来,在实例化之前无法查找名称的事实base(这是 的typedefFoo<T>)变得更加明显(对人类而言)。

于 2012-07-04T12:36:05.003 回答
7

如果基类依赖于模板参数,则其成员在派生类定义中不能直接使用。在模板被实例化之前,编译器不知道基类将包含什么,因此它不会从那里查找任何名称。

您可以通过限定名称来强制它将名称视为成员:

void doX(){this->x++; Foo<T>::y++;}  // OK: both forms specify that it's a member
于 2012-07-04T12:37:56.580 回答
3

在派生类函数中写 this->x, this->y 而不是 x, y。

于 2012-07-04T12:35:57.467 回答
1

尝试使用基类范围引用变量:

Foo<T>::x

或使用this

this->x
于 2012-07-04T12:37:14.557 回答