gpt4 book ai didi

c++ - Copy ctor 在 VS2015 中未按预期运行

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

我有一个用于执行基本/轻量级矩阵运算的小类。

template<class E, int Rows, int Cols>
class TinyExpression {
public:
static const int ROWS = Rows;
static const int COLS = Cols;

inline const E& operator () () const
{
return *static_cast<const E*> (this);
}
inline E& operator () ()
{
return *static_cast<E*> (this);
}
protected:
TinyExpression() {}
~TinyExpression() {}
private:
const TinyExpression& operator=(const TinyExpression &);
TinyExpression(const TinyExpression&);
};

template <class M, int Rows, int Cols>
class TinyNegate : public TinyExpression<TinyNegate<M, Rows, Cols>, Rows, Cols>
{
public:
typedef typename M::value_type value_type;
TinyNegate(const M& m) : _m(m) {};
inline int size() const { return _m.size(); }
inline int size1() const { return _m.size1(); }
inline int size2() const { return _m.size2(); }
inline value_type operator()(int r, int c) const { return -_m(r, c); }
private:
const M& _m;
};

在我的 TinyMatrix我上的课

template <int Rows, int Cols>
class TinyMatrix : public TinyExpression<TinyMatrix<Rows, Cols>, Rows, Cols>
{
public:
typedef double value_type;

TinyMatrix()
{
std::fill(_data, _data + Rows * Cols, 0.0);
}

TinyMatrix(const TinyMatrix<Rows, Cols>& m)
{
std::copy(m.begin(), m.begin() + size(), &_data[0]);
}

... // Lots of other stuff.

TinyNegate<TinyMatrix<Rows, Cols>, Rows, Cols> operator-() const
{
return TinyNegate<TinyMatrix<Rows, Cols>, Rows, Cols>(*this); // THIS IS THE OFFENDING LINE
}
}

违规代码已标记为 return TinyNegate<TinyMatrix<Rows, Cols>, Rows, Cols>(*this); .这段代码在 VS2013 中运行良好,现在在 VS2015 中它无法编译并出现以下错误

Severity Code Description Project File Line Suppression State Error C2280 'TinyNegate,2,1>::TinyNegate(const TinyNegate,2,1> &)': attempting to reference a deleted function MyProject f:\src\math\matrix\tiny_matrix.h 126

但我使用引用值正确定义了显式复制构造函数。我不能使用 copy-ctor 并使用直接初始化,但这会给我关于 const 的明显错误。类型。这适用于 VS2013 和 gcc...

VS2015 附带的新 C++ 编译器在做什么,为什么会出现此错误,我该如何解决?

感谢您的宝贵时间。

最佳答案

错误信息没有引用构造函数

TinyNegate(const M& m) : _m(m) {};

这实际上不是一个复制构造函数。实际的复制构造函数看起来像

TinyNegate(const TinyNegate& t) : _m(t._m) {};

添加它,代码应该可以编译。请注意,您不需要为参数类型 TinyNegate 指定模板参数。

关于c++ - Copy ctor 在 VS2015 中未按预期运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34141555/

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