2017-08-14 4 views
-4

[OK]をので、私は)int型と通話データ(によって移入されたVという名前の既存のベクトルオブジェクトにvector_refオブジェクトをリターゲットにしようとしていますconst参照を渡すと、コードのパラドックスにつながります。

class vector_ref { 
    public: 
     int* data() const { return m_data } 
     void retarget(std::vector<int> const& _t) 
     { m_data = _t.data(); 
     m_count = _t.size() } 
    private: 
     int* m_data; 
     size_t m_count; 
} 

vector_refという名前のクラス内の関数を持っています。

vector_ref<int> tmp; 
tmp.retarget(const_cast<std::vector<int> const&>(v)); 
tmp.data(); // error here 

コンパイルを再ターゲットに渡すが、()のデータを呼び出すと、エラーが得られます。

invalid conversion from const int* to int* { m_data = v.data() ... } 

これは、メンバ変数m_dataconstないよう、私には意味になりますが、このクラス定義を与えられましたどのようにしてretargetを既存のvectorにどうすればできますか? constretarget()に渡す必要がある場合、のメンバー変数m_dataが設定されていますが、vector_refインスタンスを正常に再コンパイルするコードを正常にコンパイルするにはどうすればよいですか?

+1

あなたの意向は何ですか?パラメータを 'const&'として取ると、あなたはそれを変更しないと宣言しますが、ポインタを変更することができることを示す変化可能なポインタを使いたいとします。 – Justin

+0

私は他人のプロジェクトからコードを読んで、なぜこう書いたのか理解しようとしています。 – jojeyh

答えて

3

ただ、これはm_dataconstであることを意味するものではありませんm_data

として
const int* m_data; 

を宣言します。つまり、intは変更できません。m_dataが指しています。

m_data = _t.data(); 

をしかし、あなたはこれを行うことはできません:だから、あなたはまだこれを行うことができ

*m_data = x; 
m_data[5] = y; // or this 

をところで、あなたのconst_castは必要ありません。 const修飾子を削除する場合(つまり、constオブジェクトを非const参照が必要な関数に渡す場合)、const_castが必要です。非constオブジェクトをconst参照を受け付ける関数に渡すためには、この関数は必要ありません。

関連する問題