C++ 用指向成员函数的指针填充QMap时出现问题

C++ 用指向成员函数的指针填充QMap时出现问题,c++,qt,C++,Qt,我有一个工厂类,用来构造从基类派生的类的对象。具体实例由QString标识。我想使用QMap(或类似工具)将QString映射到成员函数指针,但出现了一个错误 我尝试了各种不同的语法变体,大多数都是在这个论坛的某个地方找到的 #包括“messagefactory.h” #包括“alivecheckmessage.h” 名称空间MES{ QMap MessageFactory::messageMap; MessageFactory::MessageFactory() { //没有什么是私人的 }

我有一个工厂类,用来构造从基类派生的类的对象。具体实例由QString标识。我想使用QMap(或类似工具)将QString映射到成员函数指针,但出现了一个错误

我尝试了各种不同的语法变体,大多数都是在这个论坛的某个地方找到的

#包括“messagefactory.h”
#包括“alivecheckmessage.h”
名称空间MES{
QMap MessageFactory::messageMap;
MessageFactory::MessageFactory()
{
//没有什么是私人的
}
MessageFactory::createAliveCheckMessage(){
alivecheckmessagemsg;
返回味精;
}
MessageFactory::createMessage(QString id){
if(messageMap.isEmpty()){
messageMap[AliveCheckMessage::ID]=&createAliveCheckMessage;
}
}
}
错误在最后一行。错误消息显示:

error: assigning to 'MES::Message (MES::MessageFactory::*)()' from incompatible type 'MES::Message (\*)()' 

我该如何更正此问题?

在分配给映射时,请使用factory类的完整限定名:

messageMap[AliveCheckMessage::ID] = &MessageFactory::createAliveCheckMessage;

静态方法与成员函数的类型不同。静态方法基本上与全局函数的类型完全相同。您应该使方法非静态,或者将映射类型更改为普通函数指针:

std::map<std::string, Message (*)(void)>
std::map

您还需要阅读并更改方法,以返回指向
消息的指针(最好是智能指针)

messageMap[AliveCheckMessage::ID]=&MessageFactory::createAliveCheckMessage
IIRCAt猜测
createAliveCheckMessage
是静态的,但我们需要一个能够帮助您确定是否确实要编写所有这些
create
成员函数。有一种更简单的方法(使用泛型create函数),如我对的回答所示。是的,两种方法都是静态的。AliveCheckMessage只是一个类。您可能会认为它是一个简单的空类。@Scheff:我检查一下。如果更简单,为什么不呢?我已经试过了。同样的结果。我试过了有和没有“&”操作符。总之:解决方案是Saeid Yazdanis的答案和john的答案的组合。1.必须使用非静态成员函数。2.必须使用完全限定的方法名。我也尝试过这个。这将产生2个新错误:错误:预期表达式错误:对于函数样式转换或类型构造,预期“(”。@Siegfried如果您确认
createAliveCheckMessage
是否为静态,这将有所帮助。您得到的两个答案是正确的(对于静态和非静态情况),因此,如果两者都不起作用,那么你就犯了一些其他错误。但是没有看到完整的代码,我们只是猜测可能是什么。但至少将方法更改为非静态解决了这个问题!谢谢。因此我必须使用单例实例。嗯,…@Siegfried不,你不必使用单例。但是显然,调用非静态成员f函数你需要某种类型的实例。我想你是在做一个普通的新手假设,一个指向成员函数的指针存储实例以及指向函数的指针,它不是,它只是一个指针。它可以用来以某种方式提供实例。是的。我想让它成为静态的,因为我不想有太多的I此工厂类的实例。但出于其他原因。尽管您是对的,但代码不是每n个实例存储n次:)