2017-04-16 147 views
0

尝试编译下面的代码时,出现三个错误。尝试编译C++代码时出现模糊错误

  • '的iterator_category':没有任何直接或间接的基类 '的std :: iterator_traits < _Init>'
  • '_Iter_cat_t' 中的一个成员:无法专门别名模板
  • 类型“unknown-键入'意想不到的

我对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; 
} 
+2

什么是'std_lib_facilities.h'? – SurvivalMachine

+0

@SurvivalMachine我正在阅读这本书,Programming:Principles and Practice Using C++,它需要你使用这个头文件。我认为这样做可以让我不必担心需要使用哪些库。如果你有兴趣,你可以在这里找到它(http://www.stroustrup.com/Programming/std_lib_facilities.h)。 – Bluegorilla101

+0

'(find(letters [0],letters [size],rand)'这是对std :: find的调用吗?如果是这样,那就是你的问题,'char's不是迭代器,使用'letters.cbegin )'和'letters.cend()',而不是 – Pandatyr

回答

0

您正在使用find()错误。

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

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

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

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

这应该是:

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

而且,你的整体算法被破解。一旦letters达到一定的大小,您的随机数生成代码将花费大量时间来找到一些新的字母来添加到letters,这还没有被使用。一旦letters设法获取所有26个字母的字母,这将变成一个无限循环。但是,这将是一个不同的问题...

+0

真棒,修复它。非常感谢。 – Bluegorilla101