C++ 使用静态函数初始化时出现映射错误
我试图理解错误,但不知道。 地图如下所示: 标准::映射函数 并试图给出如下值: _func[int8]=&Factory::createInt8 我的班级怎么样: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
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&。什么会阻止您更改映射声明?