C++ 为什么将对象插入向量会导致C2679
很抱歉,这里没有示例,因此我们必须查看真正的代码。 发生的是,我有classC++ 为什么将对象插入向量会导致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
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
!一双专家的眼睛,我很惊讶!