我有一个类,我使用std::mem_fn
来选择辅助函数。
&
减速中缺少m_funcContainer
?在使用&
/**/
myStruct/*&*/
中
醇>
std::map < std::string, std::function<void(const myClass*, myStruct/*&*/) >> m_funcContainer
(但是m_funcContainerInt
编译器出现编译错误)
错误C2664:'void(int&amp;)const':无法转换参数1 'int'到'int&amp;'
为什么编译器可以将参数'myStruct'转换为'myStruct&amp;'在 的std ::功能
我的简化代码是
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 {}
EDITED 我正在编辑Microsoft visual studio 2013
答案 0 :(得分:2)
您的问题是MSVC2013在其默认设置下不是C ++编译器。它编译了一种与C ++密切相关的语言,但带有“扩展”。你被其中一个人咬了。
/Za
会关闭(大多数?)语言扩展程序,我相信包括导致您出现问题的语言扩展程序。
我听说有报告称MSVC附带的某些标头(系统标头)可能会遇到/Za
的问题。并且,在/Za
关闭的情况下编译和测试的代码可能会在/Za
打开时出现意外的行为更改。我会默认将它包含在新文件或项目中,如果你有一个旧项目激活它,测试它不会导致问题。