C ++模板参数作为基类

时间:2012-04-10 19:56:34

标签: c++ templates

为什么派生类在被模板化时不被允许访问其受保护的基类成员?

class MyBase {
protected:
    int foo;
};

template<typename Impl>
class Derived : public Impl {
public:
    int getfoo() {
            return static_cast<Impl*>(this)->foo;
    }
};

编译器抱怨foo受到保护。为什么呢?

error: int MyBase::foo is protected

1 个答案:

答案 0 :(得分:11)

您通过foo而不是MyBase*访问Derived<MyBase>*。您只能通过自己的类型访问受保护的成员,而不能通过基本类型访问。

请改为尝试:

int getfoo() {
        return this->foo;
}

从C ++ 2003标准,11.5 / 1 [class.protected]:“当派生类的朋友或成员函数引用受保护的非静态成员函数或 受保护的基类的非静态数据成员...访问必须通过a 指向派生类本身(或从该类派生的任何类)的指针,引用或对象“