2012-05-04 15 views
0

私は関数borderの各ノードの関数fを実行するための関数preorder処理を持っています。関数は次のようになります。テンプレート関数を別のテンプレート関数に渡す

template <class Item, class Key, class Process> 
void preorder_processing(bstNode<Item, Key>*& root, Process f) 
{ 
    if (root == NULL) return; 
    f(root); 
    preorder_processing(root->left(), f); 
    preorder_processing(root->right(), f); 
} 

残念ながら、main関数内からクラスを呼び出すと、エラーが発生します。この呼び出しはpreorder_processing(root_ptr、print)です。そして、実際の関数「print」コマンドは、次のとおりです。

template<class Item> 
void print(Item a) 
{ 
    cout << a << endl; 
} 

エラーは次のとおりです。

bstNode.cxx:23: error: no matching function for call to ‘ preorder_processing(bstNode<int, long unsigned int>* <unresolved overloaded function type>)

は、誰もが何が起こっているのか知っていますか?

+0

あなたが与える必要があります'inorder_processing()'の宣言も同様に機能します。 'print()'関数は何をしていますか? – iammilind

+0

おっと、同じような機能のために同じエラーメッセージが2つあり、間違ったものを投稿しました。私の悪い。 preorder_processing()はエラーメッセージのinorderではありません。 – vanchagreen

答えて

0

あなたroot->left()root->right()右辺値ポインターあるbstNode<Item, Key>*を返すべきです。一時ポインタ変数に非const参照を割り当てることはできません。

の変更以下のように宣言し、コンパイラエラーが行く必要があります:あなたは関数を呼び出すとき

void preorder_processing(bstNode<Item, Key>* root, Process f) 
       // removed reference ^^^ 

はまた、第二パラメータProcess fは、任意の値を渡されていません。

preorder_processing(root->left(), ???); 
+0

それは理にかなっており、私はそれを残しておきますが、私たちの問題を解決していないのは恐れています。実際には何も変えていない。正確に同じエラーです。 – vanchagreen

+0

@vanchagreenは、私の答えに記載されている 'Process f'パラメータをチェックしましたか? – iammilind

+0

申し訳ありませんが、私はある時点でそれを取り出し、それを戻すことはありません。:\しかし、まだ動作していません。関数への最初の呼び出しでクラッシュします。それは決してその中に入ることはありません。 – vanchagreen