C++ vector存储工厂函数指针报无匹配构造函数错误
错误原因
你声明operands_factory时指定的元素类型是std::pair<eOperandType, IOperand*>,其中第二个成员的类型是指向IOperand实例的指针,但你实际要插入的&Factory::createInt8是静态成员函数指针,完整类型为IOperand* (*)(const std::string&),两种类型完全不兼容,不存在隐式转换路径,编译器无法构造符合声明类型的pair对象,因此抛出编译错误。
编译器报错信息已经明确提示了类型不匹配问题:你传入的pair第二个元素是函数指针
IOperand* (*)(const std::__cxx11::basic_string<char>&),但vector要求的pair第二个元素是IOperand*,找不到匹配的pair构造函数。
第一个operands向量能正常工作,是因为你插入的参数类型和声明的std::pair<std::string, eOperandType>完全匹配,不存在类型偏差。
修复方案
- 第一步:修改
operands_factory的元素类型声明,将第二个模板参数从IOperand*替换为匹配的工厂函数指针类型:
// Factory类内修改operands_factory的声明 std::vector<std::pair<eOperandType, IOperand* (*)(const std::string&)>> operands_factory;
- 第二步(可选优化):如果觉得原生函数指针写法冗长、易读性差,可以先用类型别名定义函数指针类型,再用于vector声明,修改后的完整Factory类成员定义如下:
class Factory { // 预先定义工厂函数指针的类型别名 using FactoryCreateFunc = IOperand* (*)(const std::string&); public: Factory(); static IOperand* createOperand(eOperandType type, const std::string& value); ~Factory(); protected: private: 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); std::vector<std::pair<std::string, eOperandType>> operands; // 用别名声明vector,代码更简洁易维护 std::vector<std::pair<eOperandType, FactoryCreateFunc>> operands_factory; };
修改完类型声明后,构造函数里原有的operands_factory.emplace_back(std::make_pair(INT8, &Factory::createInt8));代码无需改动,即可正常编译通过。
内容的提问来源于stack exchange,提问作者dolor3sh4ze
相关产品推荐
相关产品推荐

