在Visual Studio 2013中编译的STL列表代码在Visual Studio 2019中给出了错误.想知道原
STL list Code that compiles in Visual Studio 2013 gives error in Visual Studio 2019. Wanted to know the reason
在Visual Studio 2019上编译以下C /STL代码时,它给出以下编译错误:
no instance of overloaded function matches the argument list argument types are: (Client::SetInstObj (std::string (*)(_bstr_t bsName), std::string (*)(_bstr_t bsInstance))) object type is: std::list<Client::SetInstObj, std::allocator<Client::SetInstObj>>
代码可重现Visual Studio 2019中的错误:
`class Client
{
public:
Client();
Client(string szURL);
~Client();
static string s_szUserName;
static string s_szVersion;
class SetInstObj
{
public:
SetInstObj(string szModelName, string szInstance)
{
ModelName = szModelName;
Instance = szInstance;
}
string ModelName;
string Instance;
};
};
bool GetModelInst(list<Client::SetInstObj> &modelInstance)
{
bool bRetVal = true;
CComBSTR bsName;
CComBSTR bsInstance;
Client::SetInstObj instanceObject(string(_bstr_t(bsName)),
string(_bstr_t(bsInstance)));
modelInstance.push_back(instanceObject);
return bRetVal;
}
`
代码在Visual Studio 2013中正确编译。
以下代码修复了Visual Studio 2019中的汇编问题:
`
CComBSTR bsName;
CComBSTR bsInstance;
Client::SetInstObj instanceObject(string(_bstr_t(bsName.m_str)),
string(_bstr_t(bsInstance)));
modelInstance.push_back(instanceObject);
`
想知道在Visual Studio 2019中看到错误的原因是什么?
虽然这是一个打破的变化,但这是一件好事。这意味着MSV现在更符合标准标准。这是MSVS 2013无法正确处理的最令人沮丧的解析问题。当你有
时Client::SetInstObj instanceObject(string(_bstr_t(bsName)), string(_bstr_t(bsInstance)));
您实际上并未创建名为instanceObject
的Client::SetInstObj
。取而代之的是,string(_bstr_t(bsName))
被解释为返回string
并采用_bstr_t
bsName
的未命名功能指针。string(_bstr_t(bsInstance))
也发生了同样的事情,这意味着您实际上有
Client::SetInstObj instanceObject(string(*)(_bstr_t), string(*)(_bstr_t));
这又意味着instanceObject
不是对象,而是声明函数的函数声明,该声明声明返回Client::SetInstObj
并采用两个string(*)(_bstr_t)
的函数。
要解决此问题,您可以通过用{}
替换()
来使用统一的初始化来表示您要创建一个对象而不是函数。那会将代码更改为
Client::SetInstObj instanceObject{string{_bstr_t{bsName}}, string{_bstr_t{bsInstance}}};
原因
Client::SetInstObj instanceObject(string(_bstr_t(bsName.m_str)), string(_bstr_t(bsInstance)));
工作是因为string(_bstr_t(bsName.m_str))
不能被解释为功能指针,因为bsName.m_str
不是有效的参数名称。然后,这告诉编译器您不是在创建函数,而是创建对象。
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 试图在visual studio上用C++创建一个桌面应用程序
- 如何在MS Visual Studio 2019中运行QT UI
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- Visual Studio Code - C++ Debugger 無法啟動
- Visual Studio 2019:插入多个C++风格的单行注释
- Visual Studio Code "undefined reference to `WinMain@16'"
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- Visual Studio中的函数声明和函数定义问题
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- Visual Studio mkl_link_tool.exe链接错误
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 不同的Visual Studio版本中缺少.dll
- 用Visual Studio在C++中嵌入Julia
- Visual Studio 2017循环自动向量化问题
- 有没有办法在远程设备上打开和编辑visual Studio 2017解决方案
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- Visual Studio在尝试读取resource.txt文件时崩溃
- Visual Studio 2017 不允许我创建 C++ 专用模板