std::function对象的C++映射引发 "函数模板专用化失败 "的错误。

问题描述 投票:0回答:1

我很难解决这个与我的C++学校项目有关的问题。基本上,我需要一个地图,其中键是给定的。GUID 的成员函数,其值是 MyClass的派生类实例的工厂方法。BaseClass,返回为 BaseClass 指针。代码是这样的。

class MyClass{
private:
    std::map<GUID, std::function<BaseClass*(ClassX*, ClassY*, const GUID*)>> map;
    template<typename T>
    BaseClass* createInstance(ClassX* classX, ClassY* classY, const GUID* guid);
public:
    BaseClass* getDerivedInstance(ClassX* classX, ClassY* classY, const GUID* guid);
    //...
};

工厂方法:

template<typename T>
BaseClass* MyClass::createInstance(ClassX* classX, ClassY* classY, const GUID* guid){
    return new T(classX, classY, guid);
}

从地图中调用工厂的方法

BaseClass* MyClass::getInstance(ClassX* classX, ClassY* classY, const GUID* guid){
    return map[*guid](classX, classY, guid);
}

在构造函数中,我用工厂方法填充地图(目前只有一个),像这样。

map[classGuid] = std::bind<BaseClass*>(&MyClass::createInstance<DerivedClassX>, this, std::placeholders::_3);

类MyClass是一个单子,所以它只被填充一次.代码没有显示任何错误,但是当编译时,MSVS2019抛出以下错误。

'std::invoke': 没有找到匹配的重载函数 Failed to specialize function template 'unknown-type std::invoke(_Callable &&,_Types &&...) noexcept()'。

我甚至还试过这样做

using plain_fnc = BaseClass* (MyClass::*)(ClassX*, ClassY*, const GUID*);
using bind_eq = decltype(std::bind<BaseClass*>(std::declval<plain_fnc>(),
    std::declval<MyClass*>(), std::declval<const decltype(std::placeholders::_3)&>()));

bind_eq factory = std::bind<BaseClass*>(&MyClass::createInstance<DerivedClassX>, this, std::placeholders::_3);
map[classGuid] = factory;

我花了几个小时试图解决这个问题,但不知道是什么问题。)

c++ std-function stdbind
1个回答
1
投票

你忘了第一个占位符。

map[classGuid] = std::bind<BaseClass*>(&MyClass::createInstance<DerivedClassX>, this,
    std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);

你也可以用lambda:

map[classGuid] = [this](ClassX* classX, ClassY* classY, const GUID* guid) {
                     return createInstance<DerivedClassX>(classX, classY, guid);
                 };

演示

© www.soinside.com 2019 - 2024. All rights reserved.