0

申し訳ありませんが、例がないので、ここで実際のコードを調べる必要があります。何が起こるかというと、クラスがあります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: クラス CItemElem ヘッダー (item.h)

CItemElem は CItemBase から派生し、オーバーロードされた = 演算子を持ち、これも CItemBase = 演算子を通過することに注意してください。これはからitem.cppです:

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

2 に答える 2

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 &です。

于 2012-09-01T15:32:17.750 に答える
2

CItemElem にはoperator=(CItemElem&). この関数は引数を受け入れることができず(コンパイラが正確に伝えたように) 、要素型としてconstの要件を満たしていません。std::vectorこのクラスを で使用することはできませんstd::vector

于 2012-09-01T15:28:12.867 に答える