gpt4 book ai didi

c++ - std::runtime_error 子类的 "call to deleted constructor of"编译器错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:30:35 25 4
gpt4 key购买 nike

我从 std::runtime_error 派生了一个异常类,以便添加对异常流的支持。我收到一个奇怪的编译器错误输出,我不确定如何解决?

clang++ -std=c++11 -stdlib=libc++ -g -Wall -I../ -I/usr/local/include Main.cpp -c
Main.cpp:43:19: error: call to deleted constructor of 'EarthException'
throw EarthException(__FILE__, __LINE__)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../EarthException.hpp:9:12: note: function has been explicitly marked deleted here
struct EarthException : public Exception<EarthException>


template <typename TDerived>
class Exception : public std::runtime_error
{
public:
Exception() : std::runtime_error("") {}

Exception(const std::string& file, const unsigned line)
: std::runtime_error("")
{
stream_ << (file.empty() ? "UNNAMED_FILE" : file) << "[" << line << "]: ";
}

virtual ~Exception() {}

template <typename T>
TDerived& operator<<(const T& t)
{
stream_ << t;
return static_cast<TDerived&>(*this);
}

virtual const char* what() const throw()
{
return stream_.str().c_str();
}

private:
std::stringstream stream_;
};

struct EarthException : public Exception<EarthException>
{
EarthException() {}

EarthException(const std::string& file, const unsigned line)
: Exception<EarthException>(file, line) {}

virtual ~EarthException() {}
};
}

更新:

我现在添加了对 std::runtime_error("") 的显式调用,因为它指出默认构造函数被标记为 =delete 但是错误仍然存​​在。

最佳答案

由于 ExceptionEarthException 中用户声明的析构函数,这些类的移动构造函数和移动赋值运算符的隐式生成被禁用。并且由于只移动数据成员 std::stringstream,隐式复制成员被删除。

然而,所有这些都是一种干扰。

你的 what 成员注定失败:

        virtual const char* what() const throw()
{
return stream_.str().c_str();
}

这创建了一个右值 std::string,然后返回一个指向该临时值的指针。在客户端可以将指针读入该临时文件之前,临时文件会被破坏。

您需要做的是将 std::string 传递给 std::runtime_error 基类。然后您不需要持有 stringstream 或任何其他数据成员。唯一棘手的部分是使用正确的 string 初始化 std::runtime_error 基类:

template <typename TDerived>
class Exception : public std::runtime_error
{
static
std::string
init(const std::string& file, const unsigned line)
{
std::ostringstream os;
os << (file.empty() ? "UNNAMED_FILE" : file) << "[" << line << "]: ";
return os.str();
}
public:
Exception(const std::string& file, const unsigned line)
: std::runtime_error(init(file, line))
{
}

private:
<del>std::stringstream stream_;</del>

现在您将获得隐式复制成员,一切都会正常进行。

关于c++ - std::runtime_error 子类的 "call to deleted constructor of"编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12123117/

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