Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Visual Studio 2013中编译的STL列表代码在Visual Studio 2019中出现错误。我想知道原因 < >在VisualStudio 2019编译以下C++ + STL代码时,它给出以下编译错误:_C++ - Fatal编程技术网

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