2012-05-04 13 views
3

私はこの面白い状況があります。キュー<string&>エラー

文字列を保持する構造体がたくさんあります。

struct foo 
{ 
    string mStringName; 
} 
vector<foo> mFoos; 

私は、文字列の参照

queue<string&> mStringQueue; 

のキューを持っているそして最後に、私はconstの文字列HERESに&

void Bar(const string&); 

状況を受け入れる機能を持っています。

//...in some loop 
currentFoo = mFoos[index]; 

// Queue up the string name. 
mStringQueue.push(currentFoo.mStringName); 


//...Later on, go through our queue and pass each one to the function. 

for (int queueIndex = 0; queueIndex < mStringQueue.size(); queueIndex++) 
{ 
    Bar(mStringQueue.front()); 
    mStringQueue.pop(); 
} 

これは私に次のコンパイルエラーが得られます。

エラーC2664: 'STD ::キュー< _Ty> ::プッシュ':「文字列&(&)に '文字列' からパラメータ1を変換することはできませんが「

私はdefinitleyトラブルの文字列の参照とその他もろもろの周りに私の心をラップを抱えているので、任意の助けをいただければ幸い種類の要件を満たしていない

答えて

6

参照型ということができます標準的な容器で使用すること。特にコピー可能ではありません。参照されるオブジェクトはコピー可能かどうかは問わないが、参照自体はコピーできないことに注意してください。

代わりにポインタをコピーして保存することもできます。

+0

データが動的ではないため、参照を使用しようとしていました。どのように私はキューを使用して行くだろう? myQueue.push(新しいSTRING(foo-> mStringName));またはmyQueue.push(&foo-> mStringName)); – MintyAnt

+0

すでにデータが保存されているので、データを複製しないように2番目のオプションに進むことができます。また、後で手動で文字列を削除する負担から解放されます。 – Tibor

1

標準的なコンテナでは、「Tはコピー可能(厳密にはCopyConstructible)」または「Tは移動可能(厳密にはMoveConstructible)」を必要とします。 参照要素が必要な場合は、std :: queue < std :: reference_wrapper < T>>を使用できます。

#include <cassert> 
#include <queue> 
#include <functional> // std::reference_wrapper, std::ref 

int main() 
{ 
    int a = 1; 
    int b = 2; 
    int c = 3; 

    std::queue<std::reference_wrapper<int>> que; 

    que.push(std::ref(a)); 
    que.push(std::ref(b)); 
    que.push(std::ref(c)); 

    while (!que.empty()) { 
     que.front() += 1; 
     que.pop(); 
    } 

    assert(a == 2); 
    assert(b == 3); 
    assert(c == 4); 
} 
関連する問題