这是与其他人类似的问题,但是我已经检查了将其标记为重复项的内容,并且由于我要么不理解它们,或者它们与我无关,所以一般的回答并没有帮助我问题。我需要针对此问题的帮助和/或解决方案。请,谢谢。 我正在构建一种“编程语言”(但实际上不是,只是不知道如何描述它),在我的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
答案 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
实现默认构造函数,还是要在此处初始化它。没有人能为您解决这个问题,这是只有您才能做出的决定。