尝试编译C ++代码时出现模糊错误

时间:2017-04-16 11:31:42

标签: c++ compiler-errors

当尝试编译下面的代码时,我得到三个错误。

  • 'iterator_category':不是'std :: iterator_traits< _InIt>'
  • 的任何直接或间接基类的成员
  • '_ Iter_cat_t':无法专门化别名模板
  • 输入'unknown-type'意外

我对C ++很陌生,并且多次更改代码片段但是没有任何帮助。任何有助于解密这些错误消息的帮助都非常感谢。

#include "../../std_lib_facilities.h"

class Puzzle {
public:
    vector<char> letters;
    Puzzle(int my_size);
    void generate(void);
    void enter_letters(void);
    void feedback(Puzzle puzzle);

private:
    int size = 4;
};

Puzzle::Puzzle(int my_size)
{
    size = my_size;
}

//Generate size unique letters for the letters array.
void Puzzle::generate(void)
{
    for (int i = 0; i < size; ++i) {
        char rand = randint(26) - 1 + 'a';
        while ((find(letters[0], letters[size], rand) != letters[size])) {
            rand = randint(26) - 1 + 'a';
        }
        letters[i] = rand;
    }
}

//Let the user enter size unique letters.
void Puzzle::enter_letters(void)
{
    cout << "Enter four different letters seperated by spaces:\n";
    for (int i = 0; i < size; ++i) {
        char letter;
        cin >> letter;
        letters[i] = letter;
    }   
}

//Tell the user how many bulls and cows they got.
void Puzzle::feedback(Puzzle puzzle)
{
    int cows = 0, bulls = 0;

    for (int i = 0; i < size; i++) { //input
        for (int j = 0; j < size; ++j) { //puzzle
            if (i == j && letters[i] == puzzle.letters[j]) {
                ++bulls;
                break;
            }
            else if (letters[i] == puzzle.letters[j]) {
                ++cows;
                break;
            }
        }
    }
    cout << "Bulls: " << bulls << "\nCows: " << cows << "\n";
}

//Seed the random function.
void seed(void)
{
    int sum = 0;
    cout << "Enter a random string of characters:\n";
    string str;
    cin >> str;
    for (char& c : str) 
        sum += c;
    srand(sum);
}

int main()
{
    constexpr int GAME_SIZE = 4;
    seed();

    Puzzle puzzle(GAME_SIZE);
    puzzle.generate();
    Puzzle input(GAME_SIZE);

    input.enter_letters();
    while (puzzle.letters != input.letters) {
        input.feedback(puzzle);
        input.enter_letters();
    }
    cout << "Congragulations, you did it!\n";

    keep_window_open();
    return 0;
}

1 个答案:

答案 0 :(得分:0)

您正在使用find()错误。

find(letters[0], letters[size], rand)

您的lettersstd::vector。您将向量中的第一个值和向量中的最后一个值传递给std::find

这实际上是未定义的行为,因为size并不总是letters向量的实际大小。所以,除了你的编译错误之外,你还会得到一个随机的崩溃,作为额外的奖励。

std::find are iterators of a sequence to search的前两个参数,而不是值。

这应该是:

find(letters.begin(), letters.end(), rand)

此外,您的整体算法已被破坏。一旦letters达到一定的大小,您的随机数生成代码将花费大量时间来查找要添加到letters的新字母,而这些字母尚未使用。一旦letters设法获得字母表中的所有26个字符,这将变成无限循环。但这将是一个不同的问题......