首页 > 解决方案 > 从模板类继承:“成员”未在此范围内声明

问题描述

template<typename T> class A {
protected:
    int member;
};

template<typename T> class B : public A<T> {
    B() {
        member = 12;
    }
};

当我尝试编译上述程序时,我得到:

test.cpp: In constructor ‘B<T>::B()’:
test.cpp:8:9: error: ‘member’ was not declared in this scope
         member = 12;
         ^~~~~~

我知道如何解决问题。我只是更改member=12this->member=12. 我的问题是:为什么编译器不编译这个?

我会指出,尽管模板尚未以任何方式实例化,但仍会发出错误。它只是定义了两个类,仍然是模板形式。

标签: c++language-lawyer

解决方案


如果您以一种不直观地引用模板参数的方式使用名称,那么它绝对应该依赖于模板参数!

void foo();

template <typename T>
struct A : T {
    void bar() {
        foo();
    }
};

如果T有一个foo成员函数,那么调用会解析为成员而不是全局函数,这可能会非常糟糕。

如果没有全局foo变量,您可能会争辩说它可以解析为成员函数/数据成员作为后备,但这会使语言复杂化并且可能会混淆正确(“我想调用成员foobar,但我没有意识到那里是一个恰好具有正确签名的全局函数”)。

在您的示例中,有人可以专攻A没有member数据成员。member会改用假设的全局变量吗?用this->它是明确的。


推荐阅读