简单地说,我的编译器拒绝调用复制构造函数和我提供的赋值运算符。
我有一个大学项目,使用架构分层(域,存储库,服务和UI)在C ++中创建类似数据库的程序。最初我被要求使用std::vector
,我没有任何挣扎就完成了程序。但现在我必须用{strong>简单链接列表替换std::vector
我已经完成了链接列表的编写工作,我已经测试了所有功能。但是,当我在程序中实现它时,替换std::vector
,编译器不会识别复制构造函数和赋值运算符!
以下是链接列表实现的一部分(没有Node
类和ForwardIterator
类,我已经测试过并且似乎没有引起任何问题)
template <class ElemType>
class LinkedList
{
Node<ElemType> *front, *back;
public:
LinkedList() : front{ NULL }, back{ NULL } {}
//The problematic copy constructor
LinkedList(LinkedList<ElemType>& lst) : LinkedList() {
for (auto& elem : lst)
push_back(elem);
}
~LinkedList() {
while (front != NULL)
erase(begin());
}
//The problematic assignment operator
LinkedList<ElemType>& operator=(LinkedList<ElemType>& lst) {
while (front != NULL)
erase(begin());
for (auto& elem : lst)
push_back(elem);
return *this;
}
我多次出现以下错误:
E0334 class&#34; LinkedList&lt;药剂&gt;&#34;没有合适的拷贝构造函数
E0349没有操作员&#34; =&#34;匹配这些操作数
C2440&#39;初始化&#39;:无法转换为&#39; LinkedList&lt;药剂&gt;&#39;至 &#39;&链表LT;药剂&gt;&#39;
C2679二进制&#39; =&#39;:找不到采用右手操作数的运算符 类型&#39; LinkedList&lt;药剂&gt;&#39; (或者没有可接受的 转化率)
我通常会创建参数和自动const
,但这会给我另一个错误(不知道为什么),尽管push_back()
采用了const引用:
C2662&#39; ForwardIterator&lt;药剂&gt;链表&LT;药物&gt; ::开始(无效)&#39;:不能转换&#39;这个&#39;指针来自&#39; const LinkedList&lt;药剂&gt;&#39;到&#39; LinkedList&lt;药剂&gt; &安培;&#39;
主要错误(复制构造函数和赋值)仅在我将参数作为成员函数的返回值从service / repository / ui中传递时发生。一个导致此问题的简短示例:
class MediRepo { //repository
public:
LinkedList<Medicament> elem; //I made it public for now
//............
//Returns a copy of the medicine list
LinkedList<Medicament> getMeds() { return elem; }
}
//main
MediRepo rep;
LinkedList<Medicament> medlist{ rep.getMeds() }; //ERROR E0334 and C2440
LinkedList<Medicament> medlist{ rep.elem }; //OK
就像我说的那样,链接列表(包括构造函数和赋值运算符)在服务/存储库之外完美地工作。如果我花更多的时间,我可能会想出一个半成品的解决方法,但我希望有人可以告诉我我做错了什么给了我这些错误(如果可能的话,还有const参数的那个)。我花了太多时间试图解决这个问题...... 另外,请询问您是否希望查看更多源代码。
答案 0 :(得分:2)
这不正确。
LinkedList(LinkedList<ElemType>& lst) : LinkedList()
将其更改为此。
LinkedList(const LinkedList<ElemType>& lst) : LinkedList()
这不正确。
LinkedList<ElemType>& operator=(LinkedList<ElemType>& lst)
将其更改为此。
LinkedList<ElemType>& operator=(const LinkedList<ElemType>& lst)
你的临时工具不能与可变参考文件绑定。
答案 1 :(得分:0)
感谢@ 1201ProgramAlarm 帮助我修复C2662。正如他们提到的那样,我忘了制作列表的begin()
方法const
,这导致了上面的编译错误
for (auto& elem : lst)
。
我试图通过将复制构造函数和赋值运算符的参数设置为 non-const 来解决这个问题,这会在将临时参数传递给非时导致其他错误const引用,如@ Drew Dormann 所述。
在测试LinkedList
类时没有发生这种情况,因为我没有在测试模块中使用临时参数调用复制构造函数。从现在开始,我会记得更加关注const的正确性。谢谢你的支持!
o(_ _)o