我很抱歉,但是没有一个例子,所以我们必须在这里查看真实的代码。
会发生什么,我有课CItemElem
(注意这是一个古老的来源,请不要考虑匈牙利的记法,班级等等。)。
如下例所示,我正尝试对CItemElem
class A
{
public:
int value;
};
int _tmain( int argc, _TCHAR* argv[] )
{
std::vector<A> hold;
A a;
hold.push_back(a);
}
在课程CItemElem
中,编译器在尝试
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 );
答案 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
中无法使用此类。