2016-06-20 4 views
1

私は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 &訪問を使用することはできませんなぜ私にはわからない大きな問題を抱えていますトラバース関数

私は参考にして渡すのは良いようです。

答えて

0

トラバース機能で値をVSTとする。現在のところconst-reference(const T &)またはr-value reference(T & &)[テンプレートを使用する汎用参照]で受け入れることができるr値オブジェクトを渡しています。

template <typename T> 
template <typename VST> 
void Vector<T>::traverse (VST visit) 
{ 
    for (int i = 0; i < _size; i++) visit (_elem[i]); 
} 

、それは最初のファンクタのl-valueインスタンスを作成し、次にtraverseを呼び出し、参照することによって動作するように。

template <typename T> 
void increase (Vector<T> & V) 
{ 
    Increase<T> inc; 
    V.traverse (inc); 
} 

可能であれば、値渡しをお勧めします。 STLは値でファンクタを取ります。その後、あなたはoperator()const同様

+0

ありがとうございました!私はこのようにしてファンクタを渡すべきではないので、それが確実であることを確認するだけです。私の関数が増えるので、私はr値のオブジェクトをl値の参照にも渡します。 – youyou

+0

申し訳ありませんが、私はあなたを取得していません。あなたが見ていた問題は、l値参照のみを受け入れる関数に一時的な(r値)を渡していたためです。このバインディングは機能しません。一時変数は、値を取るか、const参照かr値参照かによってのみバインドできます(C++ 11のみ) – Arunmu

+0

ありがとう、私は自分のコードで何が問題なのか理解しています。私は一時的な値(()を増加させる)をl値参照に渡そうとすべきではありません。 – youyou

0

あなたの問題は、あなたが非const参照パラメータとして、Increase<T>()、一時的に合格しようとしているということであることを確認する必要がありますので、また、あなたは、同様const-referenceによって取るべきではありません。 C++では、一時参照をconst参照パラメータ(またはr値参照パラメータ)にバインドすることしかできません。

解決策は、値渡しするか、ローカル変数Increase<T>を宣言してV.traverse()に渡します。

+0

ありがとう!今私は私の問題の鍵は一時的なr値であることを理解しています。 – youyou

関連する問題