2017-07-10 1 views
1
#include <iostream> 
#include <vector> 
using namespace std; 

class dog { 
public: 
    dog() {} 
    dog(dog & d) { 
    } 
}; 

int main() { 
    vector<dog> vec; 
    dog d; 
    vec.push_back(d); 
    return 0; 
} 

私はベクターに犬を挿入することはできません。問題はコピーコンストラクタにあります。コピーコンストラクタでconstを追加すると、コードがコンパイルされます。なぜコピーコンストラクタにconstを追加しなければならないのか不思議です。ベクトルがこのコピーコンストラクタでクラスを挿入できないのはなぜですか?

エラーメッセージは次のとおりです。

error: binding ‘const dog’ to reference of type ‘dog&’ discards qualifiers

+0

https://stackoverflow.com/questions/1602058/why-is-the-copy-constructor-argument-const –

+0

https://stackoverflow.com/questions/441067/c-push- back-non-const-copy-constructor –

+1

ちょっと、新しい重複リスト編集機能が涼しいです。 –

答えて

1

std::vector::push_backを構築するために使用される、引数がタイプconst dog&でパラメータにバインドされると呼ばれていたときにことを意味し、(左辺値のために)そのパラメータとしてconst T&を取ります後でvectorの内のdogpush_back)。達成すべきなコピー建設、適切なコピーコンストラクタ(すなわちdog::dog(const dog&)が必要とされているために

;しかし、コピーコンストラクタの署名は、このように、コンパイラが適切なコピーコンストラクタを見つけることができなかった、const dog&を取ることができない、dog::dog(dog&)です操作を実行します。

+0

@BenjaminLindleyはい、それは十分ではありませんでした。とにかく私はそれをもっと明確にしようとしました。 – songyuanyao

関連する問題