今日の教訓
STL コンテナ の反復子をconst 関数内で使うときは const_iterator にしなければいけない.
void A::func() const { std::vector<int>::iterator iter(my_vector.begin()); // エラー std::vector<int>::const_iterator citer(my_vector.begin()); // OK ... }
恥ずかしながら const_iterator の存在を知らず,頑張って iterator を使おうとしてて,一時間弱はまってしまった.ちょうどテンプレートを多用している関数でのエラーだったのでエラーメッセージがすごいことになっていて,ただ const 性が守られていないだけなのことに全然気づかなかった.反省...
というか驚きなのは,vector はコンテキストを判断して const_iterator を返そうとしていたっぽい.それを iterator にコピーしようとしていて,それがエラーになっていたように見えたのだけれど,自分の勘違いだろうか.どうして,同じ begin() 関数なのに,そこで使える反復子が const_iterator だと判断できていたんだ?何かトリックがあるのか.
追記
単純に const 性の有無でオーバーロードしているだけですね.というか,それだけでオーバーロードできるということを知らなかった.恥ずかしい.
#include <stdio.h> class Object { public: void check() { puts("I am not const."); } void check() const { puts("I am const."); } }; int main(int argc, char** argv) { Object obj; const Object& cobj = obj; obj.check(); cobj.check(); }
$ g++ const.cc $ ./a.out I am not const. I am const.