在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

本文关键字:Studio Visual 错误 想知道 列表 编译 2013 STL 代码 2019      更新时间:2023-10-16

在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)));

您实际上并未创建名为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并采用两个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不是有效的参数名称。然后,这告诉编译器您不是在创建函数,而是创建对象。