C++ 为什么将对象插入向量会导致C2679

C++ 为什么将对象插入向量会导致C2679,c++,vector,C++,Vector,很抱歉,这里没有示例,因此我们必须查看真正的代码。 发生的是,我有classCItemElem(注意这是一个旧的源代码,请不要考虑匈牙利符号、类名等)。 在下面的例子中,我尝试对CItemElem class A { public: int value; }; int _tmain( int argc, _TCHAR* argv[] ) { std::vector<A> hold; A a; hold.push_back(a); } CItemEl

很抱歉,这里没有示例,因此我们必须查看真正的代码。 发生的是,我有class
CItemElem
(注意这是一个旧的源代码,请不要考虑匈牙利符号、类名等)。 在下面的例子中,我尝试对
CItemElem

class A
{
public:
    int value;
};

int _tmain( int argc, _TCHAR* argv[] )
{
    std::vector<A> hold;
    A a;
    hold.push_back(a);
}
CItemElem类太长且派生,因此我决定将其上载到pastebin,而不是将大量代码粘贴到这里。

请注意,CItemElem是从CItemBase派生的,并具有重载的=运算符,该运算符也通过CItemBase=运算符。这是来自
item.cpp

CItemElem& CItemElem::operator =( CItemElem & ie )
{
    CItemBase::operator =( ie );

CItemElem具有
运算符=(CItemElem&)
。此函数不能接受
const
参数(正如编译器准确地告诉您的那样),并且不满足
std::vector
作为元素类型的要求。不可能在
std::vector
中使用此类

CItemElem具有
运算符=(CItemElem&)
。此函数不能接受
const
参数(正如编译器准确地告诉您的那样),并且不满足
std::vector
作为元素类型的要求。不可能在
std::vector
中使用此类

似乎没有为
CItemElem
定义赋值运算符(
=
)。STL容器(例如
vector
)期望它们包含的内容具有特定属性,包括赋值运算符。如果可以修改该类,则可以添加一个:

class CItemElem
{
...
public:

  CItemElem & operator=(const CItemElem &other)
  {
    // copy whatever must be copied
    x = other.x;

    return *this;
  }
}
编辑:
现在,我看到标头包含赋值运算符的声明:

virtual CItemElem&      operator = ( CItemElem & ie );
但是签名是错误的——它缺少常量
const
。如果你能改变这个(在声明和定义中),它应该会起作用

编辑:

如果无法编辑基类,则有两个选项。可能最安全的方法是将代码从
CItemBase::operator=
复制到
CItemElem::operator=
中。这并不漂亮,但那是原作者的错;参数应该一直是常量。

看起来好像没有为
CItemElem
定义赋值运算符(
=
)。STL容器(例如
vector
)期望它们包含的内容具有特定属性,包括赋值运算符。如果可以修改该类,则可以添加一个:

class CItemElem
{
...
public:

  CItemElem & operator=(const CItemElem &other)
  {
    // copy whatever must be copied
    x = other.x;

    return *this;
  }
}
编辑:
现在,我看到标头包含赋值运算符的声明:

virtual CItemElem&      operator = ( CItemElem & ie );
但是签名是错误的——它缺少常量
const
。如果你能改变这个(在声明和定义中),它应该会起作用

编辑:

如果无法编辑基类,则有两个选项。可能最安全的方法是将代码从
CItemBase::operator=
复制到
CItemElem::operator=
中。这并不漂亮,但那是原作者的错;自始至终,参数应该是
const&

当然,您可以将
CItemElem
的定义删减到可以在此处发布的较小值。这里有一个提示:编译器正在抱怨赋值运算符;几乎所有其他内容都是不相关的。是的,CItemElem是CItemBase的派生类,
操作符=
重载,
virtual
重载,这意味着CiteMase也参与了=操作,问题是如何解决这个问题。当然,你可以把
CItemElem
的定义删减到更小的地方,然后在这里发布。这里有一个提示:编译器正在抱怨赋值运算符;几乎所有其他内容都与此无关。是的,CItemElem是CItemBase的派生类,
运算符=
重载,
virtual
重载,这意味着CiteMase也参与了=操作,问题是如何处理此问题谢谢!是的,这是真正的答案,可以使用带有向量的CItemElem,我只需在签名处添加
const
!一双专家的眼睛,我很惊讶!非常感谢。是的,这是真正的答案,可以使用带有向量的CItemElem,我只需在签名处添加
const
!一双专家的眼睛,我很惊讶!