C++ 使用静态函数初始化时出现映射错误

C++ 使用静态函数初始化时出现映射错误,c++,C++,我试图理解错误,但不知道。 地图如下所示: 标准::映射函数 并试图给出如下值: _func[int8]=&Factory::createInt8 我的班级怎么样: class Factory { public: Factory(); ~Factory(); static IOperand *createOperand(eOperandType type, const std::string &value); private: std::map<s

我试图理解错误,但不知道。 地图如下所示:

标准::映射函数

并试图给出如下值:

_func[int8]=&Factory::createInt8

我的班级怎么样:

class Factory
{
public:
    Factory();
    ~Factory();
    static IOperand *createOperand(eOperandType type, const std::string &value);

private:
    std::map<std::string, IOperand *(Factory::*)(const std::string &)> _func;
    static IOperand *createInt8(const std::string &value);
    static IOperand *createInt16(const std::string &value);
    static IOperand *createInt32(const std::string &value);
    static IOperand *createFloat(const std::string &value);
    static IOperand *createDouble(const std::string &value);
    static IOperand *createBigDecimal(const std::string &value);
};
错误是:

Assigning to 'std::map<std::__cxx11::basic_string<char>, IOperand *(Factory::*)(const std::__cxx11::basic_string<char> &), std::less<std::__cxx11::basic_string<char> >, std::allocator<std::pair<const std::__cxx11::basic_string<char>, IOperand *(Factory::*)(const std::__cxx11::basic_string<char> &)> > >::mapped_type' (aka 'IOperand *(Factory::*)(const std::__cxx11::basic_string<char> &)') from incompatible type 'IOperand *(*)(const std::string &)' (aka 'IOperand *(*)(const basic_string<char> &)')
赋值时出错。

Factory::createInt8是静态成员函数,&Factory::createInt8的类型不是IOperand*Factory::*常量std::string&,而是IOperand**const std::string&

可以将贴图的类型更改为

或者使这些函数成为非静态成员函数。

IOperand*工厂::*常量std::string&;
IOperand *createInt8(const std::string &value);
IOperand *createInt16(const std::string &value);
IOperand *createInt32(const std::string &value);
IOperand *createFloat(const std::string &value);
IOperand *createDouble(const std::string &value);
IOperand *createBigDecimal(const std::string &value);
描述指向成员函数的指针。 您尝试分配的是指向函数的指针

因此,地图的类型应为:

标准::映射函数; 映射的值类型是IOperand*Factory::*const std::string&,它们是工厂的非静态成员函数。您的类中有静态成员函数。您可以通过更改映射的值tpe或更改函数来解决此问题

IOperand *createInt8(const std::string &value);
IOperand *createInt16(const std::string &value);
IOperand *createInt32(const std::string &value);
IOperand *createFloat(const std::string &value);
IOperand *createDouble(const std::string &value);
IOperand *createBigDecimal(const std::string &value);
选择1 更改值类型

std::map<std::string, IOperand *(*)(const std::string &)> _func;

我会让您找出最适合您需要的方法。

编译器已经为您编写了完整的答案:所需的映射值类型是IOperand**const std::string&,而不是IOperand*Factory:*const std::string&。什么会阻止您更改映射声明?