我已将自定义类Unit
放在std::atomic
中。使用默认构造函数的类如下所示:
namespace Base
{
template <typename T, typename R, typename D>
class Unit
{
public:
constexpr Unit() = default;
private:
T m_Value;
};
}
它一直运行良好,直到我发现我忘记将默认构造函数中类的唯一成员初始化为零。因此,我删除了= default
并提供了构造函数的实现
template <typename T, typename R, typename D>
constexpr Unit<T, R, D>::Unit() :
m_Value(T(0))
{ }
现在我遇到了编译器错误:
Error C2280 'std::atomic<Base::Unit>::atomic(void) noexcept': attempting to reference a deleted function
我的直觉是因为我现在提供了一个自定义构造函数,这使得默认的副本构造函数不再被隐式定义。
所以,我也将它添加到了类声明中
Unit(const Unit<T, R, D>& U) = default;
但是,我遇到了同样的错误。我不确定会怎样。我不确定编译器是指哪个删除的函数。
任何帮助将不胜感激
答案 0 :(得分:6)
这里的问题是您类型的异常保证。 Per this post/reference您的默认构造函数为noexcept。添加自己的代码时,您没有提供异常说明,因此不是noexcept
。您需要做的是将其添加到默认构造函数中,因为std::atomic
的默认构造函数被标记为noexcept
namespace Base
{
template <typename T, typename R, typename D>
class Unit
{
public:
constexpr Unit() noexcept;
private:
T m_Value;
};
template <typename T, typename R, typename D>
constexpr Unit<T, R, D>::Unit() noexcept :
m_Value(T(0))
{ }
}
int main()
{
std::atomic<Base::Unit<int, int, int>> foo;
}
答案 1 :(得分:3)
一种解决方法是删除构造函数并使用default member initializers:
template<class T>
struct Unit {
T value = 0;
};
int main() {
std::atomic<Unit<int>> a;
std::atomic<Unit<int>> b = data = pd.read_excel("assignment1.xlsx")[:21]
;
}