调用 to(列表和push_front)没有匹配函数
No matching function for call to (list and push_front)
对于游戏策划者,我需要生成所有可能的猜测。 我想把它们放在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::array
和std::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)
}
除非
aantGaatjes
是编译时常量,否则您将创建一个所谓的"可变长度数组"。这是在C99中引入的(在我和其他人看来是严重的错误),但在C++无效。不过,一些编译器支持它作为扩展(例如GCC)。
依赖编译器扩展会使您的代码不可移植,另一个编译器可能无法提供相同的支持,因此除非您别无选择,否则不要使用扩展。这一行的第一个问题是你用
&gok
生成的指针类型:它将是指向特定长度(char(*)[SomeLength]
)数组的指针类型,而不是指向字符的指针。如果您需要后者,则只需将数组本身作为参数传递,它将自动衰减为指针(但由于 (3),我不会明确显示!gok
是一个局部变量,因此在退出函数时会立即销毁。然后,列表中剩下的是指向某个很久以前就失效的对象的指针,即一个悬空的指针,使用它会导致未定义的行为!
要解决第三个问题,您需要创建一个具有动态存储持续时间的数组,即char* gok = new char[...];
.这将同时解决第一个问题。但是,您需要在以后的某个时间点注意适当的销毁,否则您将保持内存泄漏。但是,有两种数据类型允许自动执行此操作:std::vector
和std::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);
}
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- C++:如何正确地将 deque::front() 返回的变量从函数中传递出去?
- Boost::msm 如何使用非默认构造函数初始化state_machine_def和 msm::front::sta
- 与链接列表运算符中的传递值(例如C 标头文件中的删除(front))中,我如何使用布尔函数
- 如何使用const_reference类型来声明一个变量并为其赋值 front() 函数的返回值
- 链表Front()函数语法错误