我只是好奇。我将指针传递给带有签名的函数。
void printCommandReceived(const CommandDescriptor &descriptor)作为具有签名的构造函数的第三个参数。
CommandLogFilter::CommandLogFilter(QSharedPointer<LogServer> logServer, QObject *parent,
void (*preprocessValidCommand)(CommandDescriptor &descriptor))并从g++编译器获得错误:
error: invalid conversion from ‘void (*)(const CommandDescriptor&)’ to ‘void (*)(CommandDescriptor&)’ [-fpermissive]根据我的理解,对非const对象的引用应该可以用作引用const对象参数的参数。因此,对于接受非const对象引用的函数,带有类型指针的参数应该满足类型指针到函数的参数(并进行隐式转换),后者甚至接受const对象引用。
我哪里错了?
发布于 2016-11-17 10:57:09
void (*)(const CommandDescriptor&)和void (*)(CommandDescriptor&)是两种完全不同、互不相关的类型。
关于const,有非常简单的规则:X*可以转换为X const*,X**可以转换为X const * const *等等。推荐信也是一样的。其他的都不允许。
请注意,规则不允许在类型中的任何位置任意添加或删除const,例如,不能将X**转换为X const **。函数参数的位置也是如此:您只是不能在那里添加或删除const以获得兼容的类型。
这些规则能否得到扩展,以适应像你这样的情况,并保持一致?可能是的。但事实并非如此。
发布于 2016-11-17 13:57:09
C++有一组有限的情况,可以隐式地添加或删除const。你遇到了一个无法做到的地方。原因可能很简单,比如“描述那些安全的案例将很难,而标准作者则是懒惰和保守的”。
作为一项工作,你可以这样做:
CommandLogFilter bob(
logServer,
parent,
[](CommandDescriptor &descriptor) {
return printCommandReceived(descriptor);
}
);因为无状态lambdas可以隐式地将其转换为指向与其签名匹配的函数的指针。
我不喜欢在那里明确签名,但是没有办法对模板"auto“做类似的事情,并且很不幸地推导出了签名。
https://stackoverflow.com/questions/40652599
复制相似问题