【发布时间】:2015-10-26 12:13:54
【问题描述】:
我有一个类,我使用std::mem_fn 在辅助函数之间进行选择。
- 如果我在
m_funcContainer减速中缺少&,为什么我的代码会被编译并运行?在代码&中用/**/myStruct/*&*/注释掉
std::map < std::string, std::function<void(const myClass*, myStruct/*&*/) >> m_funcContainer
(但在m_funcContainerInt的情况下编译器会出现编译错误)
错误 C2664: 'void (int &) const' : 无法将参数 1 从 'int' 到 'int &'
- 我觉得我的问题的标题没有以最佳方式制定,请您帮我制定技术上更正确的标题吗?
为什么编译器可以将参数 'myStruct' 转换为 'myStruct &' in 标准::函数
我的简化代码是
myClass.h
#include <memory> #include <map> #include <functional> struct ExtraFlag { }; struct Flag { }; struct myStruct { std::shared_ptr<ExtraFlag> extraFlag; std::shared_ptr<Flag> flag; explicit myStruct() { } }; class myClass { private: std::map < std::string, std::function<void(const myClass*, myStruct/*&*/) >> m_funcContainer; std::map < std::string, std::function<void(const myClass*, int/*&*/) >> m_funcContainerInt; private: void funcMyStruct(myStruct& arg1) const; void funcInt(int& arg1) const; public: myClass(); };
myClass.cpp
#include "myClass.h" myClass::myClass() { m_funcContainer["func"] = std::mem_fn(&myClass::funcMyStruct); myStruct myStructInstance; m_funcContainer.at("func")(this, myStructInstance); int a; m_funcContainerInt["func"] = std::mem_fn(&myClass::funcInt); m_funcContainerInt.at("func")(this, a); } void myClass::funcMyStruct(myStruct& arg1) const {} void myClass::funcInt(int& arg1) const {}
已编辑 我正在 Microsoft Visual Studio 2013 上编译
【问题讨论】:
-
我一直在查看这段代码,如果你在
std::map声明中删除了引用,那么它不应该编译,但由于函数签名不匹配,这是出于不同的原因。您能否提供一个minimal reproducible example,因为我不确定您是如何得到错误的。 -
感谢您的回复。我将创建一个简单的例子。
-
在为
MyStructg++ 4.9.3/cygwin 等缺少的类添加一些前向引用后,仅编译,函数签名采用引用。 -
与clang 相同,但如果您删除
void myStruct::funcMyStruct(myStruct& arg1) const中的引用,它也会编译。 -
抱歉,提供错误示例。所以我编辑了有问题的代码并将我的测试项目中的代码放在那里。