首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板函数图

模板函数图
EN

Stack Overflow用户
提问于 2021-02-13 01:53:38
回答 1查看 37关注 0票数 0

我有一个这样的类:

代码语言:javascript
复制
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就是:

代码语言:javascript
复制
template<class T>
std::unique_ptr<T> factory::Tcreate() const noexcept {
    return std::make_unique<T>();
}

而另一个函数就是:

代码语言:javascript
复制
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这样的芯片组都是这样的一个类:

代码语言:javascript
复制
class chipsetXXXX : Chipset {}

我想用这段代码在这里做的是生成与字符串链接的某个芯片组的std::unique_ptr<> (参见factory::m_fac),但是当我运行它时,我的终端上会弹出很多错误消息(超出了我的终端的处理能力)。但我不知道它到底出了什么问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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>

代码语言:javascript
复制
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() )。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66176748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档