STL を引数で受け取り、イテレータでまわすには?

解決


LIS  2010-11-01 22:22:27  No: 72022  IP: [192.*.*.*]

こんにちは
VC++6.0 SDK, Windows XP でWindowsプログラミングをしています。

STLのコンテナ(?)のポインタや参照を引数で受け取り、
コンテナへデータを取得する処理と、コンテナのデータを設定する処理を
実装したいのですが、自分の思う通りにいきません。

取得は、
void GetData(std::map< std::string, std::string > * lpValue) const;
として実装できたのですが、

設定は、
void SetData(std::map< std::string, std::string > const * const lpValue);
でも
void SetData(std::map< std::string, std::string > const & value);
でも、
{for (std::map< std::string, std::string >::iterator itr = value.begin(); itr != value.end(); ++ itr) {
}}
ここでコンパイルエラーになってしまいました。

エラーメッセージはでるのですが、なにがなんだか・・・。どう直せばいいのでしょうか?
error C2440: 'initializing' : cannot convert from 'class std::_Tree<class std::basic_string<char,struct std::char_traits<char>
,class std::allocator<char> >,struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator
<char> > const ,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,struct std::map<clas
s std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::c
har_traits<char>,class std::allocator<char> >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,clas
s std::allocator<char> > >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocato
r<char> > > >::_Kfn,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >
,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >::const_itera
tor' to 'class std::_Tree<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::
pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,class std::basic_string<ch
ar,struct std::char_traits<char>,class std::allocator<char> > >,struct std::map<class std::basic_string<char,struct std::char_
traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char
> >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allo
cator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >::_Kfn,struct std::less<class
std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<class std::basic_stri
ng<char,struct std::char_traits<char>,class std::allocator<char> > > >::iterator'


ちなみに、
(A)void SetData(std::map< std::string, std::string > * lpValue);
(B)void SetData(std::map< std::string, std::string > & value);
(C)void SetData(std::map< std::string, std::string > value);
これらはコンパイルが通ることを確認しました。

しかし、(A)(B)においては、値を変更しないことを明記したいです。
(C)は値渡しになるので、ロスの小さいポインタ渡しか参照渡しにしたいです。

どうぞよろしくお願いします。

編集 削除
tetrapod  2010-11-02 06:52:35  No: 72023  IP: [192.*.*.*]

iterator は non-const なのが理由。 const-container に対しては適用できない。
const_iterator を使えばいい。

編集 削除
LIS  2010-11-02 20:40:17  No: 72024  IP: [192.*.*.*]

tetrapod様、どうもありがとうございます!

{for (std::map< std::string, std::string >::const_iterator itr = value.begin(); itr != value.end(); ++ itr) {
}

でコンパイルが通りました。

const_iteratorというものがあったのですね。。。勉強不足でした。
どうもありがとうございました m(_ _)m

編集 削除
LIS  2010-11-02 20:42:41  No: 72025  IP: [192.*.*.*]

解決チェック!!

編集 削除