从基类的静态模板方法中调用继承类的受保护的ctor失败

时间:2014-12-17 15:25:57

标签: c++ templates inheritance protected

我有一个组件类,它定义了一般应该如何创建Component的静态模板方法:

class Component {
protected:
    uint32_t id;

    Component(uint32_t id) :
            id(id) {
    }

    template<typename T, uint32_t C>
    static T* createComponent() {
        // content here not relevant
        return new T(someParameter);
    }

};

然后有一个实现,例如Button。不应该直接使用此类的构造函数,而是使用静态方法调用Component::createComponent模板函数。

class Button: public Component {
protected:
    Button(uint32_t id) :
            Component(id) {
    }
public:
    static Button* create();
};

实现看起来像这样,将类型传递给实例化,并在创建中使用常量:

Button* Button::create() {
    return createComponent<Button, UI_COMPONENT_BUTTON>();
}

现在的问题是,编译器抱怨&#34;错误:&#39; Button :: Button(uint32_t)&#39;受到保护&#34; 。根据我的理解,这个构造函数调用应该是正常的Button扩展Component,但这似乎是一个问题。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:4)

由于您的create()函数无法处理其他继承的类,您可以利用此功能而创建Button,而是通用派生,受保护,派生类,可以访问您的protected构造函数:

class Component {
    uint32_t id;
    template <typename T>
    struct Concrete: T {
        Concrete(uint32_t id): T(id) {}
    };
protected:
    Component(uint32_t id) :
        id(id) {
    }

    template<typename T, uint32_t C>
    static T* createComponent() {
        // content here not relevant
        return new Concrete<T>(C);
    }
};

class Button:
    public Component {
protected:
    Button(uint32_t id): Component(id) {}
public:
    static Button* create() {
         return createComponent<Button, UI_COMPONENT_BUTTON>();
    }
};

答案 1 :(得分:2)

Button构造函数的访问说明符受到保护,这意味着它只能由派生自Button的类访问。如果您希望代码工作,那么您必须将该构造函数设为公共。

答案 2 :(得分:0)

“Button”扩展“Component”,因此“Button”可以访问“Component”的受保护成员,但“Component”不知道“Button”,因此无法访问受保护的成员。