3

私はこの興味深い状況にあります。

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

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

文字列参照のキューもあります

queue<string&> mStringQueue;

そして最後に、const文字列を受け入れる関数があります&

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 :: queue <_Ty> :: push':パラメータ1を'String'から'String&(&)'に変換できません

私はdefinitleyが文字列参照などに頭を悩ませているので、助けていただければ幸いです。

4

2 に答える 2

7

参照型は、標準コンテナで使用できる型の要件を満たしていません。特に、それらはコピー可能ではありません。参照されるオブジェクトはコピー可能かどうかはわかりませんが、参照自体はコピー可能ではないことに注意してください。

別の方法は、コピー可能なポインタを格納することです。

于 2012-05-04T20:17:57.130 に答える
3

標準のコンテナには、「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);
}
于 2012-05-07T01:57:52.437 に答える