在 .cc 源文件中设置为默认值时,移动构造函数和移动赋值运算符会抛出错误

Move constructor and move assignment operator throw error when set to default in .cc source file

我有一个模板库 class 大致如下所示

Vector.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>;

Vector.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; 放入定义中,但对我来说它不起作用。

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

问题是默认移动无效。在 class 中,大概编译器不会为它生成代码,因为它可能没有被使用。将它放在 class 之外可能会导致编译器决定编译 operator/constructor。

用一个基本的例子来思考它:

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

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

在这种情况下,您必须为您的 class 创建自己的移动 operator/constructor。