![](/img/trans.png)
[英]Error compiler, cannot convert parameter 2 from MyStruct1 to const void*, for memcpy
[英]Why the MVS compiler can convert argument 'myStruct' to 'myStruct &'. And did not file error C2664: cannot convert 'myStruct' to 'myStruct &'
我有一個類,我使用std::mem_fn
在輔助函數之間進行選擇。
m_funcContainer
deceleration 中丟失&
? 在代碼&
使用已經注釋掉/**/
myStruct/*&*/
std::map < std::string, std::function<void(const myClass*, myStruct/*&*/) >> m_funcContainer
(但在m_funcContainerInt
的情況下,編譯器會引發編譯錯誤)
錯誤 C2664:“void (int &) const”:無法將參數 1 從“int”轉換為“int &”
為什么編譯器可以在 std::function 中將參數 'myStruct' 轉換為 'myStruct &'
我的簡化代碼是
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 上編譯
您的問題是 MSVC2013 在其默認設置下不是 C++ 編譯器。 它編譯了一種與 C++ 密切相關的語言,但帶有“擴展”。 你被其中之一咬了。
/Za
將關閉(大多數?)語言擴展,我相信包括導致您出現問題的那個。
我聽說過一些隨 MSVC(系統標頭)一起提供的標頭可能會出現問題/Za
。 而且,這是編譯和測試代碼/Za
關閉可能有意想不到的行為變化與/Za
打開。 默認情況下,我會將它包含在新文件或項目中,如果您有一個舊項目,請激活它並測試它不會導致問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.