没有匹配的函数来调用(list和push_front)

时间:2019-07-17 12:37:34

标签: c++

对于游戏策划者,我需要生成所有可能的猜测。 我想将它们放在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);

3 个答案:

答案 0 :(得分:1)

您无缘无故使用C样式数组。有两种可能的替代:std::arraystd::vector。既然我们知道:

  

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

这只会在桌上留下std::vector。需要修复的另一件事是使用输出参数,除了在代码中未正确完成之外,无论如何都是不好的做法。然后,代码变为:

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));

答案 1 :(得分:0)

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

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])的指针,而不是char的指针。如果需要后者,则只需将数组本身作为参数传递,它会自动衰减为指针(但由于(3),我不会明确显示!)。

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

要解决第三个问题,您需要创建一个具有动态存储持续时间的数组,即。 e。 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无法移动其内部数组,充其量不能移动其数组元素(在特定情况下,但是),因此您总是在推到最前面时复制阵列。

答案 2 :(得分:-6)

您要在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);

}