为什么在此代码行(第7行)出现“没有匹配的函数调用”错误?

时间:2019-08-26 22:43:31

标签: c++ pointers struct linked-list

这是与其他人类似的问题,但是我已经检查了将其标记为重复项的内容,并且由于我要么不理解它们,或者它们与我无关,所以一般的回答并没有帮助我问题。我需要针对此问题的帮助和/或解决方案。请,谢谢。 我正在构建一种“编程语言”(但实际上不是,只是不知道如何描述它),在我的ContainerList类中,我不断收到此错误,指出没有匹配的函数调用。为什么会出现此错误?

我尝试操纵在何时何地使用或定义构造函数,或者甚至不存在它。但是似乎没有运气。我查看了MemoryContainer类,似乎没有什么可导致该错误。

这是我的ContainerList类的代码:

#include "MemoryContainer.cpp"

struct ContainerListItem{
    int index = 0;
    MemoryContainer item;
    ContainerListItem* nextItem;
    ContainerListItem(byte none) {}
};

class ContainerList{
    public:
    int getSize() {return size;}
    void addContainer(MemoryContainer item){
        ContainerListItem indexItem = ContainerListItem(1);
        indexItem.item = item;
        indexItem.index = size - 1;
        indexItem.nextItem = &firstItem;
        firstItem = indexItem;
        size++;
    }
    MemoryContainer getContainer(int index){
        ContainerListItem currentItem = ContainerListItem(1);
        currentItem = firstItem;

        while(currentItem.index != index)
            currentItem = *currentItem.nextItem;

        return currentItem.item;
    }
    private:
    int size = 1;
    ContainerListItem firstItem = ContainerListItem(1);
};

已定义的构造方法的完全错误:

In file included from Main.cpp:1:
ContainerList.cpp: In constructor ‘ContainerListItem::ContainerListItem(uint8_t)’:
ContainerList.cpp:7:34: error: no matching function for call to ‘MemoryContainer::MemoryContainer()’
     ContainerListItem(byte none) {}
                                  ^
In file included from ContainerList.cpp:1,
                 from Main.cpp:1:
MemoryContainer.cpp:24:5: note: candidate: ‘MemoryContainer::MemoryContainer(uint64_t, std::__cxx11::string)’
     MemoryContainer(lint ContainerSize, string name){
     ^~~~~~~~~~~~~~~
MemoryContainer.cpp:24:5: note:   candidate expects 2 arguments, 0 provided
MemoryContainer.cpp:17:7: note: candidate: ‘MemoryContainer::MemoryContainer(const MemoryContainer&)’
 class MemoryContainer{
       ^~~~~~~~~~~~~~~
MemoryContainer.cpp:17:7: note:   candidate expects 1 argument, 0 provided
MemoryContainer.cpp:17:7: note: candidate: ‘MemoryContainer::MemoryContainer(MemoryContainer&&)’
MemoryContainer.cpp:17:7: note:   candidate expects 1 argument, 0 provided

1 个答案:

答案 0 :(得分:1)

您的ContainerListItem类的成员是另一类:

MemoryContainer item;

但是构造函数根本不初始化它:

ContainerListItem(byte none) {}

构造函数大部分为空。

类的所有成员必须由其构造函数初始化。如果构造函数未显式初始化类成员,则它必须具有用于初始化它的默认构造函数。默认构造函数是不带参数的构造函数。

您没有显示MemoryContainer类的声明,但是它必须具有一个至少带有一个参数的构造函数(实际上也可能有其他一些原因,但这是最可能的原因)。

这意味着ContainerListItem必须通过构造它来显式初始化该类成员,或者必须向MemoryContainer添加一个默认构造函数。

如果您仔细阅读了它的错误消息,这正是编译器告诉您的:

  

错误:没有匹配的函数可以调用   ‘MemoryContainer :: MemoryContainer()’

编译器告诉您该类的默认构造函数不存在。因为ContainerListItem没有显式初始化该类成员,所以必须调用其默认构造函数。但是它没有被声明。

您将在C ++书籍中找到有关初始化类成员的不同方法的更多信息。但是,例如,如果MemoryContainer only 构造函数采用一个int参数,而您希望通过以下方式对其进行初始化:用0调用其构造函数,您的ContainerListItem构造函数将读取(使用现代C ++统一初始化语法):

ContainerListItem(byte none) : item{0} {}

您需要确定是要为MemoryContainer实现默认构造函数,还是要在此处初始化它。没有人能为您解决这个问题,这是只有您才能做出的决定。