プロが教えるわが家の防犯対策術!

以下のプログラムがコンパイルできません。
理由もよく分かりません。

-----------------
#include <algorithm>
#include <list>

struct Hoge {
std::list<Hoge*> l;
Hoge * f() const {
std::list<Hoge*>::iterator i = l.begin();
return 0;
}
};
--------------------
g++ 4.1.1 を使っていますが
% g++ -c test1.cc
test1.cc: In member function 'Hoge* Hoge::f() const':
test1.cc:8: error: conversion from 'std::_List_const_iterator<Hoge*>' to non-scalar type 'std::_List_iterator<Hoge*>' requested
となります。

l.begin() が const で代入できないということだと思うのですが
std::list<Hoge*> l;
の部分には const を使っていませんし良く分かりません。

また、 Hoge * eval() const { の const を消すか、
std::list<Hoge*>::iterator i = l.begin(); の代入をやめると
コンパイルが通ります。

const は return するポインタの先の領域を変更不可にしている
と解釈しているのですが、戻り値と関係ない代入がどうして影響を受けるのかが謎です。

(実際は、もう少し違う大きいプログラムですが関係なさそうな部分を削って
上でも同様のエラーメッセージが出ることを確認しました。)

A 回答 (1件)

std::list<Hoge*>::iterator i = l.begin();



std::list<Hoge*>::const_iterator i = l.begin();

エラーメッセージをよく読みましょう。
    • good
    • 0
この回答へのお礼

コンパイルできました。
ありがとうございます。

> std::list<Hoge*>::const_iterator i = l.begin();
こういう型があるのですね。
std::list<const Hoge*>::iterator
std::list<Hoge* const>::iterator
などとは試してみたのですが

あと僕は、
Hoge * f() const {
の意味を勘違いしていました。
これは、戻り値がconstということでなくて
このメンバ関数の中でメンバ変数を変更できない
という意味なんですね。

これなら、iterator がconstでないといけない理由に納得がいきます。

お礼日時:2007/02/17 01:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!