在Visual Studio 2013中编译的STL列表代码在Visual Studio 2019中出现错误。我想知道原因 < >在VisualStudio 2019编译以下C++ + STL代码时,它给出以下编译错误:
在Visual Studio 2013中编译的STL列表代码在Visual Studio 2019中出现错误。我想知道原因 < >在VisualStudio 2019编译以下C++ + STL代码时,它给出以下编译错误:,c++,C++,没有重载函数的实例与参数列表匹配参数类型为:(Client::SetInstObj(std::string(*)(\u bstr\u bsName),std::string(*)(\u bstr\u bsInstance)))对象类型为:std::list 在Visual Studio 2019中复制错误的代码: `class Client { public: Client(); Client(string szURL);
没有重载函数的实例与参数列表匹配参数类型为:(Client::SetInstObj(std::string(*)(\u bstr\u bsName),std::string(*)(\u bstr\u bsInstance)))对象类型为:std::list
在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;
}
`
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(\u bstr\u t(bsName))
被解释为一个未命名的函数指针,它返回一个string
,并接受一个\u bstr\t
命名的bsName
。同样的事情也发生在字符串(\u bstr\u t(bsInstance))
上,这意味着您实际上有
Client::SetInstObj instanceObject(string(*)(_bstr_t), string(*)(_bstr_t));
这反过来意味着instanceObject
不是对象,而是一个函数声明,它声明了一个函数,该函数返回一个Client::SetInstObj
,并接受两个string(*)(\u bstr\u 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\u str))
不能作为函数指针进行互写,因为bsName.m\u str
不是有效的参数名称。这会告诉编译器您不是在创建函数,而是在创建对象