以下のプログラムがコンパイルできません。
理由もよく分かりません。
-----------------
#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 するポインタの先の領域を変更不可にしている
と解釈しているのですが、戻り値と関係ない代入がどうして影響を受けるのかが謎です。
(実際は、もう少し違う大きいプログラムですが関係なさそうな部分を削って
上でも同様のエラーメッセージが出ることを確認しました。)
No.1ベストアンサー
- 回答日時:
std::list<Hoge*>::iterator i = l.begin();
↓
std::list<Hoge*>::const_iterator i = l.begin();
エラーメッセージをよく読みましょう。
コンパイルできました。
ありがとうございます。
> std::list<Hoge*>::const_iterator i = l.begin();
こういう型があるのですね。
std::list<const Hoge*>::iterator
std::list<Hoge* const>::iterator
などとは試してみたのですが
あと僕は、
Hoge * f() const {
の意味を勘違いしていました。
これは、戻り値がconstということでなくて
このメンバ関数の中でメンバ変数を変更できない
という意味なんですね。
これなら、iterator がconstでないといけない理由に納得がいきます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# プログラミングのペーパーテスト 実行結果を表示せよ #include <stdio.h> int h 1 2022/07/09 15:27
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- JavaScript javascriptで文字分割は、 split() などメソッド不要??? 4 2023/02/06 22:50
- JavaScript Javascript初心者|jQueryの.val()で値を取得し複数の要素を連結させる方法知りたい 2 2022/06/02 12:06
- C言語・C++・C# プログラミングのペーパーテスト 実行結果がどのように表示されるか答えよ #include <stdi 1 2022/07/09 14:27
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- Windows 10 バッチファイルの記述法とルールについてアドバイスをお願いいたします。 1 2022/04/13 10:50
- XML XML同じ名前の要素を自動で集約するツール 1 2022/04/11 09:21
- HTML・CSS 全部のアクセスを指定したページに転送させたい 2 2022/06/28 16:33
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
リモートデスクトップの接続元I...
-
enumの値から定義名を文字列化...
-
OpenCVでRAW画像(カラー)を開...
-
_CRT_SECURE_NO_DEPRECATE が効...
-
switch文のエラーについて
-
CStdioFile での数値データの読...
-
listをvectorにコピーするときに
-
Pythonでのmmapの使い方
-
C言語 ストリームについて。
-
shared_ptr クラスについて
-
C++のifstreamの使い方
-
JPEGやPNGが読めるLoadImage関数
-
C++ 平均値、最大値と最小値の...
-
VC++で文字列から任意の文字を...
-
C++でShowCursorを使いたい。
-
なぜ、C++の標準ヘッダをインク...
-
CStringとString
-
C言語での引数の省略方法
-
Notepad++の関数リスト表示の変...
-
マイナスからプラスへ転じた時...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
std::map の const 修飾について
-
構文エラーが出ているのですが...
-
switch文のエラーについて
-
enumの値から定義名を文字列化...
-
VC++で文字列から任意の文字を...
-
構造体配列のvectorへの変換と...
-
wstringの主力
-
vectorのイテレータを大小比較...
-
std::wstringのメモリリークに...
-
opencvを使って画像比較
-
ヘッダーファイルがインクルー...
-
C++で2次元配列charをループしたい
-
【C++】ヘッダ内でstringを格納...
-
#define中の#のエスケープ
-
リモートデスクトップの接続元I...
-
string型のフォーマット書式指...
-
ファイル名のリスト取得について2
-
C++での <iostream.h>と<iostre...
-
gccでコンパイル時のエラー
-
C言語 ストリームについて。
おすすめ情報