调用 to(列表和push_front)没有匹配函数

No matching function for call to (list and push_front)

本文关键字:函数 front to 列表 push 调用      更新时间:2023-10-16

对于游戏策划者,我需要生成所有可能的猜测。 我想把它们放在list<char[]>. 我仍然收到有关push_front的错误.

有人可以帮助我吗?

void Mastermind::genereercodes (int getal, list<char[]> mogelijkeGok)
{
char gok[aantGaatjes+1]; //aantGaatjes is an integer
for (int i = 0; i < aantGaatjes; i++){
gok[i] = (getal % aantKleuren) + '0'; //aantKleuren is an integer
getal = getal / aantKleuren;
} // for
mogelijkeGok.push_front (&gok);
}   // genereercodes

这是我得到的错误:

mastermind.cc: In member function ‘void Mastermind::genereercodes(int,std::__cxx11::list<char []>)’: 
mastermind.cc:200:32: error: no matching  unction for call to ‘std::__cxx11::list<char []>::push_front(char *)[(((Mastermind*)this)->Mastermind::aantGaatjes + 1)])’
mogelijkeGok.push_front (&gok);

你无缘无故地使用 C 样式数组。有两种可能的替代品:std::arraystd::vector。因为我们知道:

用户需要放弃 aantGaatjes 的值,因此在程序运行之前您不知道该值。

这只剩下std::vector摆在桌面上。需要修复的另一件事是使用 out-参数,除了在代码中不正确之外,无论如何都是不好的做法。然后,代码变为:

std::vector<char> Mastermind::genereercodes (int getal)
{
std::vector<char> gok(aantGaatjes+1);
for (char& e : gok) {
e = (getal % aantKleuren) + '0';
getal = getal / aantKleuren;
}
return gok;
}

这不会处理追加到列表,也不需要。拥有该列表的调用方可以简单地这样调用它:

mogelijkeGok.push_front(genereercodes(getal));

您的代码存在几个问题; 删除不相关的行:

void Mastermind::genereercodes (int getal, list<char[]> mogelijkeGok)
{
char gok[aantGaatjes+1];         // (1)
mogelijkeGok.push_front (&gok);  // (2), (3)
}
  1. 除非aantGaatjes是编译时常量,否则您将创建一个所谓的"可变长度数组"。这是在C99中引入的(在我和其他人看来是严重的错误),但在C++无效。不过,一些编译器支持它作为扩展(例如GCC)。
    依赖编译器扩展会使您的代码不可移植,另一个编译器可能无法提供相同的支持,因此除非您别无选择,否则不要使用扩展。

  2. 这一行的第一个问题是你用&gok生成的指针类型:它将是指向特定长度(char(*)[SomeLength])数组的指针类型,而不是指向字符的指针。如果您需要后者,则只需将数组本身作为参数传递,它将自动衰减为指针(但由于 (3),我不会明确显示!

  3. gok是一个局部变量,因此在退出函数时会立即销毁。然后,列表中剩下的是指向某个很久以前就失效的对象的指针,即一个悬空的指针,使用它会导致未定义的行为!

要解决第三个问题,您需要创建一个具有动态存储持续时间的数组,即char* gok = new char[...];.这将同时解决第一个问题。但是,您需要在以后的某个时间点注意适当的销毁,否则您将保持内存泄漏。但是,有两种数据类型允许自动执行此操作:std::vectorstd::array。(实际上,还有更多,但这两个是最常用的)。

如果您生成的所有数组都具有相同的长度,则可以使用std::array,否则需要使用std::vector。您还需要更改数据结构,因此您的函数可能如下所示:

void Mastermind::genereercodes (int getal, std::list<std::vector<char>> mogelijkeGok)
{
std::vector<char> gok;
gok.reserve(aantGaatjes+1); // not absolutely necessary, but prevents re-allocations
// so always good idea to use if you know size in advance
for (int i = 0; i < aantGaatjes; i++)
{
gok.push_back(getal % aantKleuren + '0');
getal /= aantKleuren;
//    ^  effectively does the same, but less to write and better to read...
}
mogelijkeGok.push_front(std::move(gok)); // move semantics, prevents unnecessary copy
}

更优化一点,也避免移动:

mogelijkeGok.emplace_front();
std::vector<char&> gok = mogelijkeGok.front();
gok.reserve(aantGaatjes+1);
// rest as was, but no push_front, of course...

如果您选择std::array,您应该使用优化的变体,因为std::array不能移动其内部数组,充其量只能移动其数组元素(尽管不是在给定的情况下),因此您总是在推送到前面时复制数组。

你想在 char 数组列表中放置对 char 数组的引用:

void Mastermind::genereercodes (int getal, list<char[]> mogelijkeGok)
{
char gok[aantGaatjes+1]; //aantGaatjes is an integer
...
mogelijkeGok.push_front (&gok);
} 

应该是:

void Mastermind::genereercodes (int getal, list<char[]> mogelijkeGok)
{
char gok[aantGaatjes+1]; //aantGaatjes is an integer
...
mogelijkeGok.push_front (gok);
}