0

我有一个看起来大致像这样的模板基类

矢量.cc:

template<typename T, unsigned int D>
class Vector {

    private:
        T _data[D];

        ...

    public:
        Vector(Vector<T, D>&&);

        ...

    public:
        Vector<T, D>& operator=(Vector<T, D>&&);;
};

extern template class Vector<int, 2>;
extern template class Vector<int, 3>;
extern template class Vector<int, 4>;

矢量.h

// include guard

#include "Vector.h"

template<typename T, unsigned int D>
Vector<T, D>::Vector(Vector<T, D>&&) = default;

template<typename T, unsigned int D>
Vector<T, D>& Vector<T, D>::operator=(Vector<T, D>&&) = default;

template class Vector<int, 2>;
template class Vector<int, 3>;
template class Vector<int, 4>;

// include guard

当我编译这个我得到错误error: array used as initializererror: invalid array assignment警告note: synthesized method [...] first required here

当我将其= default;放入.h文件中的声明时,我没有收到任何错误或警告。

我已经阅读了多个来源,我可以将其= default;放入定义中,但对我来说它不起作用。

我究竟做错了什么?我错过了什么吗?还是我只是依赖错误的来源?

4

1 回答 1

1

问题是默认移动无效。在类内部,大概编译器不会为它生成代码,因为它可能没有被使用。将它放在类之外可能会导致编译器决定编译运算符/构造函数。

想想一个基本的例子:

int array[5]; 
int array2[5]; 
array = array2;

以上在 C++ 中无效,因为数组不能相互分配。

在这种情况下,您必须为您的班级创建自己的移动运算符/构造函数。

于 2020-05-07T19:01:37.287 回答