gpt4 book ai didi

c++ - 从基类的静态模板方法中调用继承类的 protected 构造函数失败

转载 作者:可可西里 更新时间:2023-11-01 17:54:19 29 4
gpt4 key购买 nike

我有一个组件类,它定义了一般情况下应该如何创建 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>();
}

现在的问题是,编译器提示 “错误:'Button::Button(uint32_t)' protected ”。根据我的理解,这个构造函数调用应该没问题,因为 Button 扩展了 Component,但这似乎是一个问题。

我该如何解决这个问题?

最佳答案

由于您的 create() 函数将无法处理进一步继承的类,您可以利用它并且创建一个 Button 而是一个通用派生的、 protected 派生类,它可以访问你的 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>();
}
};

关于c++ - 从基类的静态模板方法中调用继承类的 protected 构造函数失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27529000/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com