我有一个这样的类:
class factory;
using factory_ptr = std::unique_ptr<IComponent> (factory::*)() const noexcept;
class factory {
public:
factory();
~factory() = default;
std::unique_ptr<Chipset> &create(const std::string &type);
private:
template<class T>
std::unique_ptr<T> Tcreate() const noexcept;
std::map<std::string, factory_ptr> m_fac;
};
#include "factory.inl"我的模板函数Tcreate就是:
template<class T>
std::unique_ptr<T> factory::Tcreate() const noexcept {
return std::make_unique<T>();
}而另一个函数就是:
factory::factory() {
m_fac.emplace("4001", &factory::Tcreate<chipset4001>);
m_fac.emplace("4008", &factory::Tcreate<chipset4008>);
m_fac.emplace("4011", &factory::Tcreate<chipset4011>);
m_fac.emplace("4030", &factory::Tcreate<chipset4030>);
m_fac.emplace("4069", &factory::Tcreate<chipset4069>);
m_fac.emplace("4071", &factory::Tcreate<chipset4071>);
m_fac.emplace("4081", &factory::Tcreate<chipset4081>);
m_fac.emplace("4512", &factory::Tcreate<chipset4512>);
}
std::unique_ptr<Chipset> &factory::create(const std::string &type) {
if (m_fac.find(type) == m_fac.end()) {
throw nts::exception("can't find the chipset: " + type, "FactoryCreate");
}
return (this->*(m_fac.find(type)->second))();
}每一个像chipsetXXXX这样的芯片组都是这样的一个类:
class chipsetXXXX : Chipset {}我想用这段代码在这里做的是生成与字符串链接的某个芯片组的std::unique_ptr<> (参见factory::m_fac),但是当我运行它时,我的终端上会弹出很多错误消息(超出了我的终端的处理能力)。但我不知道它到底出了什么问题。
发布于 2021-02-13 06:14:39
问题是您的Tcreate函数没有所需的签名。您正在尝试创建返回std::unique_ptr<IComponent>的函数映射,但Tcreate()返回std::unique_ptr<T>。
我假设Chipset是从IComponent继承过来的。正如您所注意到的,每个T都继承自Chipset。因此,从std::unique_ptr<chipset4001>到std::unique_ptr<IComponent>的转换当然是可能的,但这并不意味着签名匹配。例如,不能将指向函数double do_thing ()的指针赋给需要int (*) ()的函数指针。
因此,解决方案是将Tcreate的返回类型更改为std::unique_ptr<IComponent>
template<class T>
std::unique_ptr<IComponent> factory::Tcreate() const noexcept {
return std::make_unique<T>();
}但是,当您这样做时,您将在create()中得到一个编译错误,因为它试图返回一个std::unique_ptr<Chipset>。在那里做什么由你决定。要么返回std::unique_ptr<IComponent>,要么将factory_ptr更改为指向返回std::unique_ptr<Chipset>的函数的指针(当然也要相应地更改Tcreate() )。
https://stackoverflow.com/questions/66176748
复制相似问题