在MSVC2013中编译好的代码似乎混淆了MSVC2015

时间:2016-09-28 17:07:57

标签: c++ visual-studio-2015 compiler-errors

我正在尝试将我的开发环境从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年似乎认为我正在尝试移动构建它?

我不知道这里有什么问题,或谷歌有哪些关键字来解决这个问题...提前感谢任何指示。

2 个答案:

答案 0 :(得分:2)

在C ++语言规范中,当谈到throw语句时,它说:

  

抛出异常拷贝 - 初始化一个称为异常对象的临时对象。

因此,您投掷的异常对象需要可复制。

由于您的复制构造函数是私有的,因此无法访问它。您需要公开并实施它。

答案 1 :(得分:0)

本声明:

throw curl_error{ cc };

正在尝试从另一个curl_error构建curl_error。所以我们需要复制构造函数。您发布的代码具有私有拷贝构造函数。

您只需将复制构造函数设为公开。