C++ 在MSVC2013中编译良好的代码似乎混淆了MSVC2015
我正试图将我的开发环境从VisualStudio2013迁移到2015年,我的一个项目遇到了一个奇怪的问题。编译器似乎认为我试图引用一个已删除的move构造函数,而实际上我试图使用一个常规构造函数来抛出一个类的实例 我正在围绕libcurls的HTTP功能编写一个薄包装。这里有一个编译错误的例子。我在代码的相似但不同的部分又得到了两个C++ 在MSVC2013中编译良好的代码似乎混淆了MSVC2015,c++,visual-studio-2015,compiler-errors,C++,Visual Studio 2015,Compiler Errors,我正试图将我的开发环境从VisualStudio2013迁移到2015年,我的一个项目遇到了一个奇怪的问题。编译器似乎认为我试图引用一个已删除的move构造函数,而实际上我试图使用一个常规构造函数来抛出一个类的实例 我正在围绕libcurls的HTTP功能编写一个薄包装。这里有一个编译错误的例子。我在代码的相似但不同的部分又得到了两个 1>e:\code\win32\contentwatcher\contentwatcher\http_client.cpp(18): error C2248
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\u error
对象,以便将其作为异常抛出。在MSVC2013中运行良好,但2015年似乎认为我正在尝试移动它
我不知道这里出了什么问题,也不知道谷歌用哪些关键词来解决这个问题。。。提前感谢您的指点。此声明:
throw curl_error{ cc };
正在尝试从另一个curl\u错误构建curl\u错误
。所以我们需要复制构造函数。您发布的代码有一个私有副本构造函数
C++文档语言规范中的复制构造函数公共化.< /p> ,当谈到 Spult/Cuth>语句时,它表示:
抛出异常副本会初始化一个临时对象,称为异常对象
因此,您抛出的异常对象需要是可复制的
由于复制构造函数是私有的,因此无法访问。您需要公开并实现它。OP具有curl\u error(const curl\u error&)=默认值代码>在他们的代码中。此外,移动将不会被使用,因为cc
是左值。只需更正答案即可。当我第一次阅读代码时,我错过了副本。而且,cc
是CURLcode
类型的变量,它是typedef enum
,而不是curl\u error
@Jehjoa你应该在问题中包含该信息。我移动了curl\u error(const curl\u error&)=default代码>到类定义的公共部分,但它仍然给出相同的错误。该类有2个成员变量。据我所知,编译器生成的复制构造函数会自动调用这些成员变量上的复制构造函数,对吗?@Jehjoa因为错误特别提到了移动构造函数的行,所以您也应该尝试公开该行。谢谢,通过公开移动构造函数修复了此问题。它仍然是默认值
,但它可以工作。复制构造函数仍然是private
和delete
d。