std::function 对象的 C++ 映射抛出 'failed to specialize function template' 错误
C++ map of std::function objects throws 'failed to specialize function template' error
我很难解决这个与我的 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);
Class 我的Class 是单例,所以填进去只是 once.Code 没有报错,但是编译的时候,MSVS2019 抛出如下错误:
'std::invoke': no matching overloaded function found
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;
,它也没有显示任何错误,但在编译时以相同的结果结束。
我花了几个小时试图解决这个问题,但不知道是什么 issue.Any help/tips 非常感谢:)
您忘记了第一个占位符:
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);
};
我很难解决这个与我的 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);
Class 我的Class 是单例,所以填进去只是 once.Code 没有报错,但是编译的时候,MSVS2019 抛出如下错误:
'std::invoke': no matching overloaded function found 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;
,它也没有显示任何错误,但在编译时以相同的结果结束。 我花了几个小时试图解决这个问题,但不知道是什么 issue.Any help/tips 非常感谢:)
您忘记了第一个占位符:
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);
};