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

时间:2012-09-01 15:24:57

标签: c++ vector

我很抱歉,但是没有一个例子,所以我们必须在这里查看真实的代码。 会发生什么,我有课CItemElem(注意这是一个古老的来源,请不要考虑匈牙利的记法,班级等等。)。 如下例所示,我正尝试对CItemElem

执行相同的操作
class A
{
public:
    int value;
};

int _tmain( int argc, _TCHAR* argv[] )
{
    std::vector<A> hold;
    A a;
    hold.push_back(a);
}

在课程CItemElem中,编译器在尝试

时给了我C2679

vector<CItemElem>hold; CItemElem item; hold.push_back(item);

Error C2679: '=' binary :no operator found which takes a right-hand operand of type 'const CItemElem' (or there is no acceptable conversion)

点击该错误会引导我到这一行*_First = _Val;xutility

上的此功能
template<class _FwdIt,
    class _Ty> inline
    void fill(_FwdIt _First, _FwdIt _Last, const _Ty& _Val)
    {   // copy _Val through [_First, _Last)
    for (; _First != _Last; ++_First)
        *_First = _Val;
    }

CItemElem类太长并且派生了所以我决定将它上传到pastebin,而不是在这里粘贴巨大的代码。 Pastebin: Class CItemElem Header (item.h)

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

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

2 个答案:

答案 0 :(得分:3)

看起来=没有定义的赋值运算符(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 &

答案 1 :(得分:2)

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