类没有合适的拷贝构造函数,没有二元运算符' ='发现,

时间:2018-04-18 22:14:12

标签: c++ database class templates visual-studio-2017

简单地说,我的编译器拒绝调用复制构造函数和我提供的赋值运算符。 我有一个大学项目,使用架构分层(域,存储库,服务和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参数的那个)。我花了太多时间试图解决这个问题...... 另外,请询问您是否希望查看更多源代码。

2 个答案:

答案 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