在 .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 initializer
和 error: 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。
我有一个模板库 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 initializer
和 error: 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。