私はVectorクラスを持っています(組み込みではありません)。私はVectorクラスをトラバースすることができる組み込みの関数を記述したいと思います。 はベクトルクラスがこのように定義される:ファンクタはC++で動作しません
template <typename T> class Vector{int _size; int _capicity ; T* _elem;
/(protected and public functions/};
そしてIはパブリック関数トラバースを書き込む:
template <typename T> template <typename VST>
void Vector<T>::traverse (VST& visit)
{ for (int i = 0; i < _size; i++) visit (_elem[i]); }
//visit here represent some action that I am gonna perform on the elements
コードをテストする: I [i]は_elemを実行するためのファンクタを書き込む++ベクトルクラスのすべての要素に適用されます。メインプログラムで
template <typename T>
struct Increase
{virtual void operator() (T& e) { e++; } };
、私は関数書き込み:
template <typename T>
void increase (Vector<T> & V)
{ V.traverse (Increase<T>()); }
注:この関数はファンクタで増加関数とは異なります。ここで
は、私は私のプログラムをテストする方法である:
Vector<int> c={1,2,3,4,5}; //initialize my vector class
increase(c);
それはエラーメッセージを返します。
no match function for call to 'traverse'.
私はそれが私がトラバース宣言する方法とは何かをしている可能性があります把握します。
void Vector<T>::traverse (VST& visit);
V.traverse (Increase<T>());//this is the way I called this function.
それから私はここに「&」削除し、VST訪問を使用して、この時間は、それが動作しますが、私はまだ私がの変数としてVST &訪問を使用することはできませんなぜ私にはわからない大きな問題を抱えていますトラバース関数
私は参考にして渡すのは良いようです。
ありがとうございました!私はこのようにしてファンクタを渡すべきではないので、それが確実であることを確認するだけです。私の関数が増えるので、私はr値のオブジェクトをl値の参照にも渡します。 – youyou
申し訳ありませんが、私はあなたを取得していません。あなたが見ていた問題は、l値参照のみを受け入れる関数に一時的な(r値)を渡していたためです。このバインディングは機能しません。一時変数は、値を取るか、const参照かr値参照かによってのみバインドできます(C++ 11のみ) – Arunmu
ありがとう、私は自分のコードで何が問題なのか理解しています。私は一時的な値(()を増加させる)をl値参照に渡そうとすべきではありません。 –
youyou