3 回答
向量的元素必须是:
- 可复制,即具有与
T(const T&)
. - 可分配,即与
operator=
兼容operator=(const T&)
。 - 默认可构造,即具有与
T()
.
虽然错误表明违反了可分配的要求,但代码表明并非如此。每个类都有一个编译器生成的复制构造函数和赋值运算符,除非它们是手动定义的,所以你的类实际上应该是可赋值的。但是,只有在没有定义其他构造函数时才会隐式生成默认构造函数。您有一个构造函数,因此还必须定义一个默认构造函数。
正如 Mike 所指出的,要求减少到只能在 C++11 中移动,但您需要一个已经支持相应 C++11 功能的编译器,并且必须启用这些功能。但是,错误中的路径表示 Visual Studio 9.0,也就是 Visual Studio 2008,它早于 C++11,因此限制适用。
默认情况下,可复制和可分配是满足的,除非你破坏了它们。规范说,
在 12.8.4 中:
如果类定义没有显式声明复制构造函数,则隐式声明。
在 12.8.10 中:
如果类定义没有显式声明复制赋值运算符,则隐式声明一个。
在这两种情况下,仅当所有基类和所有成员都具有可访问且明确的对应复制构造函数和复制赋值运算符时才定义。
您发布的代码没有任何问题。听起来您的真实类(或基类)声明了一个非公共赋值运算符。这意味着该类是不可分配的,因此对于如何在标准容器中使用它存在限制。如果它不可复制,您也会遇到问题 - 也就是说,如果声明了非公共复制构造函数。
在 C++03 中,根本无法使用。您需要使其可复制构造和可分配以在任何标准容器中使用它。
vector
在 C++11 中,只要它是可移动的,它就可以存储在 a中。push_back
如果它也是不可复制的,则可能无法正常工作,在这种情况下,您可以使用emplace_back(1,2,3)
or push_back(std::move(a))
。
您需要将 operator= 和复制构造函数添加到 A 类
class A
{
public:
A(int a,int b,int c);
A(const A& element);
A& operator=(const A& element); //which needs definition
};