2017-03-31 58 views
1

即時嘗試編譯一個學校作業,但即時通訊出錯,並且由於在這個小時沒有合格的老師可以在uni,我來這裏尋求幫助。C++未能專注功能模板'iterator_traits'

即時得到一個錯誤,指出: 「錯誤C2893無法專注函數模板 'iterator_traits < _Iter> :: difference_type的std ::距離(_Init,_init)'」 行22

我不知道,爲什麼發生此錯誤。

代碼:

#pragma once 
// ttt.h 

#ifndef TTT_H 
#define TTT_H 

#include <tuple> 
#include <array> 
#include <vector> 
#include <ctime> 
#include <random> 
#include <iterator> 
#include <iostream> 

enum class Player { X, O, None }; 
using Move = int; 
using State = std::array<Player, 9>; 

// used to get a random element from a container 
template<typename Iter, typename RandomGenerator> 
Iter select_randomly(Iter start, Iter end, RandomGenerator& g) { 
    std::uniform_int_distribution<> dis(0, std::distance(start, end) - 1); 
    std::advance(start, dis(g)); 
    return start; 
} 

template<typename Iter> 
Iter select_randomly(Iter start, Iter end) { 
    static std::random_device rd; 
    static std::mt19937 gen(rd()); 
    return select_randomly(start, end, gen); 
} 

std::ostream &operator<<(std::ostream &os, const State &state); 
std::ostream &operator<<(std::ostream &os, const Player &player); 

Player getCurrentPlayer(const State &state); 
State doMove(const State &state, const Move &m); 
Player getWinner(const State &state); 
std::vector<Move> getMoves(const State &state); 

#endif // TTT_H 

函數調用「:

State mcTrial(const State &board) 
{ 
    State currentBoard = board; 
    std::vector<Move> possibleMoves = getMoves(currentBoard); 
    while (possibleMoves.size() > 0) { 
     int move = select_randomly(0, (int)possibleMoves.size() -1); 
     Move m = possibleMoves[move]; 
     currentBoard = doMove(currentBoard, m); 
     possibleMoves = getMoves(currentBoard); 
    } 
return currentBoard; 
} 
+0

你在哪裏使用'select_randomly'。 – Jarod42

+1

這取決於用於實例化模板函數'seter'的類型'seter' t_randomly'。顯示你對'select_randomly'的調用。 –

+0

順便說一句,在輸出窗格中,您應該有更長的錯誤消息。 – Jarod42

回答

1

你應該通過迭代器select_randomly,沒有索引這裏是正確的函數調用:std::vector<Move>::iterator it = select_randomly(possibleMoves.begin(), possibleMoves.end());要了解更多關於迭代器訪問http://www.cprogramming.com/tutorial/stl/iterators.html

+0

我將如何使用此選擇結果作爲一種舉動?移動m = possibleMoves [它]給出錯誤 – FrankK

+0

當然,因爲迭代器不是索引。按照鏈接閱讀如何正確使用它們。 –

+0

好的,如果你不想學習迭代器的東西,只需使用它像Move m = * it; –