gpt4 book ai didi

c++ - STL 列表在 Visual Studio 2013 中编译的代码在 Visual Studio 2019 中出错。想知道原因

转载 作者:行者123 更新时间:2023-11-30 03:15:39 24 4
gpt4 key购买 nike

在 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 中出现错误的原因是什么?

最佳答案

虽然这是一个重大变化,但它是一件好事。这意味着 MSVS 现在更符合标准。这是 most vexing parse MSVS 2013 未正确处理的问题。当你有

Client::SetInstObj instanceObject(string(_bstr_t(bsName)), string(_bstr_t(bsInstance)));

您实际上并没有创建名为 instanceObjectClient::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 并接受两个 的函数字符串(*)(_bstr_t)

要解决此问题,您可以使用 uniform initialization通过将 () 替换为 {} 来表示您想要创建一个对象而不是一个函数。这会将代码更改为

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 不是有效的参数名称。然后,这会告诉编译器您不是在创建函数,而是在创建对象。

关于c++ - STL 列表在 Visual Studio 2013 中编译的代码在 Visual Studio 2019 中出错。想知道原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56853575/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com