2017-01-04 5 views
0

私は構造体キャッシュのベクトルを持っています。 Moveコンストラクタを実装するキャッシュ。このベクトルを反復して特定の条件で要素を消去しようとすると、コンパイルに失敗します。イテレータを使用してベクトル要素を消去することはできません。ベクトル要素は移動コンストラクタを実装します

struct Cache { 
    Cache() {} 

    Cache(Cache&& other) 
     : serviceName(std::move(other.serviceName)) 
    {} 

    ~Cache() {} 

    size_t referenceCount; 
    std::string serviceName; 
}; 

std::vector<Cache> vectorCaches; 
auto iter = vectorCaches.begin(); 
while(iter != vectorCaches.end()) { 
    if(iter->serviceName == "Sample") { 
     iter = vectorCaches.erase(iter); //compiler error here 
    } else { 
     iter++; 
    } 
} 

コンパイラエラー:

error: use of deleted function 'Cache& Cache::operator=(const Cache&)' __result = std::move(__first); ^note: 'Cache& Cache::operator=(const Cache&)' is implicitly declared as deleted because 'Cache' declares a move constructor or move assignment operator struct Cache {

ベクトル要素は、コンストラクタを動かす実装したときに消去を達成するための任意の回避策はありますか?どんな助けもありがとうございます。

+0

移動コンストラクタ「noexcept」を作成してみてください。 –

+2

@KerrekSB OPが移動割当演算子を定義する必要はありませんか? – NathanOliver

+0

@ NathanOliver:確かにそうです。 –

答えて

5

コピーコンストラクタではなくムーブコンストラクタを作成することで、タイプをコピーできなくしました。

これは問題ありませんが、ベクターでは、特にコンテナから取り除いて次のすべての要素をシャッフルする必要がある場合、要素を記憶領域にコピーまたは移動する必要があります。これは割り当てによって行われます。

クラスを移動してコピーできないようにすることができますが、移譲代入演算子を書く必要があります。

一般的に、コピーコンストラクタを作成する場合は、コピー代入演算子を記述します。移動コンストラクタを記述する場合は、移動代入演算子を記述します。

ところで、あなたのループは壊れています。サービス名と一致しない場合は、コンテナを通過しません。

+0

一般的に、基本的なデザインルール(http://en.cppreference.com/w/cpp/language/rule_of_three)を守ることは、この種の問題を回避するのに役立ちます。 –

+0

@FelixLauer:ゼロのルールが優れています。 –

+0

ああ、私はページが誤っているURIを参照してください:) –

0

このコードを削除します。

Cache(Cache&& other) 
    : serviceName(std::move(other.serviceName)) 
{} 

それは何の良い目的を果たしていません。それはバギーに見えるし、バギーでなければ非常に驚くべきものです。

と交換してください:

Cache(Cache&& other)=default; 
Cache(Cache const& other)=default; 
Cache& operator=(Cache&& other)=default; 
Cache& operator=(Cache const& other)=default; 

あるいは、いくつかのケースでは、それらを明示的にデフォルトに作るようなすべて4. Iを省略します。

Cache(Cache&&)を作成すると、暗黙的に上記の他のメンバー関数、特にoperator=(Cache&&)のうちvector.eraseが使用されるため、コンパイラエラーが発生します。

+0

私はこれらの変更を加えて試しました。その問題を解決します。ここで提供されている構造体は小型化された構造体ですが、実際の構造体はこれよりも大きく、移動コンストラクタを保持する方が優れています。とにかく洞察のために感謝:) – sandy

関連する問題