2017-03-31 5 views
1

私は学校の課題をコンパイルしようとしていますが、間違いました。この時間にuniで利用可能な資格のある教師がいないので、エラーになっC++は関数テンプレート 'iterator_traits'を特化できませんでした

イム: "エラーC2893は、関数テンプレートを専門に失敗しました 'にiterator_traits < _Iter> :: difference_typeのはstd ::距離(_init、_init')" ラインを22

iは理由として見当もつかないこのエラーが発生します。

コード:

#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

テンプレート関数' selecをインスタンス化するために使用される 'Iter'型に依存します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

に追加します。これを使って結果を移動としてどのように選択するのですか? Move m = possibleMoves [it]はエラーを返します – FrankK

+0

イテレータはインデックスではないので、もちろんそうです。リンクに従って適切に使用する方法をお読みください。 –

+0

さて、イテレータのことを学びたくない場合は、Move m = * itのように使ってください。 –

関連する問題