gpt4 book ai didi

c++ - 在 MSVC2013 中编译良好的代码似乎混淆了 MSVC2015

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

我正在尝试将我的开发环境从 Visual Studio 2013 迁移到 2015,但我的一个项目遇到了一个奇怪的问题。不知何故,编译器似乎认为我正在尝试引用已删除的移动构造函数,而我实际上是在尝试使用常规构造函数来抛出类的实例。

我正在围绕 libcurls HTTP 功能编写一个精简的包装器。这是我遇到的编译错误的一个示例。我在代码的相似但不同的部分又得到了两个。

1>e:\code\win32\contentwatcher\contentwatcher\http_client.cpp(18): error C2248: 'http::curl_error::curl_error': cannot access private member declared in class 'http::curl_error'
1> e:\code\win32\contentwatcher\contentwatcher\http_client.hpp(19): note: see declaration of 'http::curl_error::curl_error'
1> e:\code\win32\contentwatcher\contentwatcher\http_client.hpp(16): note: see declaration of 'http::curl_error'

这是 http_client.hpp 的相关部分:

namespace http {

class curl_error : public std::runtime_error ////////////////// LINE 16
{
curl_error(const curl_error &) = default;
curl_error(curl_error &&) = delete; /////////////////////// LINE 19
curl_error &operator=(const curl_error &) = delete;
curl_error &operator=(curl_error &&) = delete;
public:
curl_error(const char *message, CURLcode cc);
curl_error(CURLcode cc);
~curl_error() = default;
protected:
private:
CURLcode m_code;
std::string m_details;
};

class curl_init
{
curl_init(const curl_init &) = delete;
curl_init(curl_init &&) = delete;
curl_init &operator=(const curl_init &) = delete;
curl_init &operator=(curl_init &&) = delete;
public:
curl_init(long flags = CURL_GLOBAL_DEFAULT);
~curl_init() = default;
protected:
private:
};

} // namespace http

以及实际编译错误发生的http_client.cpp的相关部分:

http::curl_init::curl_init(long flags)
{
auto cc = curl_global_init(flags);
if (cc != CURLE_OK) throw curl_error{ cc }; /////////////// LINE 18
}

如您所见,我只是试图构造一个 curl_error 对象,以便将其作为异常抛出。在 MSVC2013 中运行良好,但 2015 年似乎认为我正在尝试移动构建它?

我不知道这里出了什么问题,或者谷歌用哪些关键字来解决这个问题...在此先感谢您的指点。

最佳答案

在C++语言规范中,在谈到throw语句时,是这样说的:

Throwing an exception copy-initializes a temporary object, called the exception object.

因此您抛出的异常对象需要是可复制的。

因为你的复制构造函数是私有(private)的,所以它是不可访问的。您需要将其公开并实现。

关于c++ - 在 MSVC2013 中编译良好的代码似乎混淆了 MSVC2015,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39753704/

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