こんにちは
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)は値渡しになるので、ロスの小さいポインタ渡しか参照渡しにしたいです。
どうぞよろしくお願いします。
iterator は non-const なのが理由。 const-container に対しては適用できない。
const_iterator を使えばいい。
tetrapod様、どうもありがとうございます!
{for (std::map< std::string, std::string >::const_iterator itr = value.begin(); itr != value.end(); ++ itr) {
}
でコンパイルが通りました。
const_iteratorというものがあったのですね。。。勉強不足でした。
どうもありがとうございました m(_ _)m
解決チェック!!
ツイート | ![]() |