2011-07-19 5 views
1

与える:C++テンプレート関数は、私はこれで何が間違っている見当がつかないタイトルが十分説明的でなかった場合、私は申し訳ありませんが、エラー

template <class S, class P> 
    P* findPolicy(boost::ptr_vector<P> &policies,S *state) 
    { 
    typename boost::ptr_vector<P>::iterator it; 
    for (it = policies.begin(); it != policies.end(); ++it) 
    { 
     if (*it->getState() == state) 
     { 
     return &(*it); 
     } 
    } 
    } 

私は内から上記の関数を呼び出すと以下のメンバ関数:

template <class S> template <class P> 
void Policy<S>::updateOptimal(boost::ptr_vector<P> &policies) 
{ 
    S *curr_state = state; 
    boost::ptr_vector<Action> actions = curr_state->getAllActions(); 
    P *best_pol; 
    boost::ptr_vector<Action>::iterator iter; 
    for (iter = actions.begin(); iter != actions.end(); ++iter) 
    { 
    if (iter->getNextState()) 
    { 
     S *s = dynamic_cast<S *>(iter->getNextState()); 
     P *temp_pol = var::findPolicy<S,P>(policies,s); 
     if (temp_pol->getValue() > best_pol->getValue()) 
     { 
     opt_Action = &(*iter); 
     } 
    } 
    } 
} 

私は常に取得: policy.hpp:237: error: no matching function for call to 'findPolicy(boost::ptr_vector<Greedy<guState>, boost::heap_clone_allocator, std::allocator<void*> >&, State*&)

+2

あなたは質問に取り組まなければならない、それはかなり混乱している。エラーメッセージの半分が消えてしまったことを認識するまでにはしばらく時間がかかりました。エラーメッセージ全体でも、その出力を生成したコードのオプションはどれも明確に示されていません。私の助言は、テンプレート定義を表示し、それをそのまま呼び出している関数を表示することです(無関係なコードは削除しますが、引数の型定義はすべてテンプレートのままにしておきます)。コンパイラがエラーメッセージに候補のセットをリストする場合があります。そのような場合は、質問に追加してください。 –

+0

2つの機能を示す質問全体を編集しました。今私がしようとしていることがもっと明確になったら教えてください。 –

+1

最初に明白なことを試してください:彼らは同じ翻訳単位ですか? 'findPolicy'が定義されている場所にファイルを含めましたか? 'var'とは何ですか?それは名前空間ですか?封筒タイプ?別々にコンパイルできる小さな例にコードを縮小しようとしましたか?とにかく質問ははるかに良いです: –

答えて

1

SPのテンプレート引数を推論することはできませんが、あなたが減算をスキップしている引数を使ってメソッドを明示的に呼び出すので、コンパイラは単純にその特定の一致を見つけることができないと伝えます。

SまたはPのいずれかがテンプレートであり、実際のタイプではないことが原因と考えられます。その場合は、その前にtypenameを追加して指定する必要があります。代わりにこれを試してみてください:

P *temp_pol = var::findPolicy<typename S, typename P>(policies, s); 

を、以下の点に注意することは、おそらくタイプミスだった:

template <class S> template <class P> 
void Policy<S>::updateOptimal(boost::ptr_vector<P> &policies) 

は、おそらく次のようになります。

template <class S, class P> 
void Policy<S>::updateOptimal(boost::ptr_vector<P> &policies) 

編集:もの奇妙な使用に気づきましたあなたの関数にPを指定していますが、boost::ptr_vector<P>&とそれにテンプレート引数とfuを渡しますパラメータは<S, P>と同じ順番ではなく、(policies, s)として渡します。このように混乱したり、誤解を招くようなコードを避けてください。

私はあなたが特定の質問をしていないのでこれを書かなかったと仮定しているので、これも理解できないものを使用しないでください。おそらくまだ発見されていない他の問題があるかもしれません。あなたは図面ボードに戻り、あなたのために維持可能な設計を思いついたほうがよいかもしれません。

+0

それは動作しません。 Deniis Zickefooseが答えました、それは控除の誤りでした。ありがとう、結構です。 –

+0

ああ、それはいいですね!コンパイラが関数テンプレートの引数を推測させる。それはあなたのための入力が少なく、より適切なエラーを引き起こすことによって問題を明らかにするのに役立ちます。 – AJG85

0

を[OK]を、ここにあなたのコード例で間違っているものです:

どこか(質問に記載されていません)実際の関数宣言があり、エラーがあります。

template<class S, class P> 
P* findPolicy(boost::ptr_vector<P> &policies,S *state); 

しかし、この種の行には何らかのエラーがあります。パラメータの1つが間違っています。だからあなたはエラーを取得します。投稿したコードは大丈夫です。

関連する問題