- ベストアンサー
C++について。
現在”猫でもわかるプログラミング”のC++編をSDKと共に勉強している身です。 現在第22章、第23章を勉強中です。 22章 http://www.kumei.ne.jp/c_lang/cpp/cpp_22.htm 23章 http://www.kumei.ne.jp/c_lang/cpp/cpp_23.htm 作業環境はVisual Studio 2005.net C++です 22章でのプログラムを作成し、実行した結果エラーが出てしまいました。 ソースです #include <iostream> class xy_position { int x; int y; public: xy_position(int x = 0, int y = 0){ xy_position::x = x; xy_position::y = y; } int X() const {return x;} int Y() const {return y;} }; ostream& operator << (ostream& o, const xy_position& p) { return o << "(" << p.X() << "," << p.Y() << ")"; } int main(void) { xy_position a(50, 60), b; std::cout << a << b << std::endl; return 0; } (17):error C2143: 構文エラー : ';' が '&' の前にありません。 (17):error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません (17):error C2065: 'o' : 定義されていない識別子です。 (17):error C2059: 構文エラー : 'const' (18):error C2143: 構文エラー : ';' が '{' の前にありません。 (18):error C2447: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?) (26):error C2679: 二項演算子 '<<' : 型 'xy_position' の右オペランドを扱う演算子が見つかりません (または変換できません)。 このようなエラーが出てしまいました。 もちろんソースは全て同様に書いています。 この”猫でも”で使用しているコンパイラと異なるために出たエラーでしょうか? それに単に cout << のように記述するとエラーが出てしまい、 std::cout << のように記述しなければ通りません。 また、エラーとは別の質問になってしまいますが、プログラム中に int X() const {return x;} という記述がありますが、このconstの意味が分かりません。 単純に return x が変更不可能という意味でしょうか? 次に23章についての質問です。 ここでもソースは同じなのに以下のようなエラーが出てしまいます。 ソースです。 #include <iostream> int main(void) { int x=10, y=15, z=20; std::cout << "16進表示" << std::endl; std::cout.setf(ios::hex); std::cout << x << std::endl; std::cout << y << std::endl; std::cout << z << std::endl; std::cout.unsetf(iostream::hex); std::cout << "8進数" << std::endl; std::cout.setf(ios::oct); std::cout << x << std::endl; std::cout << y << std::endl; std::cout << z << std::endl; return 0; } (8):error C2653: 'ios' : 識別子がクラス名でも名前空間名でもありません。 (8):error C2065: 'hex' : 定義されていない識別子です。 (13):error C2653: 'iostream' : 識別子がクラス名でも名前空間名でもありません。 (15):error C2653: 'ios' : 識別子がクラス名でも名前空間名でもありません。 (15):error C2065: 'oct' : 定義されていない識別子です。 これも何か設定をしなければいけないのでしょうか? なにぶんC++は・・・というかオブジェクト指向の言語は初心者なもので疑問も多いですorz
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
★過去にも同じような質問がありました。 ・同じカテゴリで『const』キーワードで検索すると見つかったので紹介します。 http://oshiete1.goo.ne.jp/qa1135537.html→『クラスの実装のconst』 http://oshiete1.goo.ne.jp/qa2756332.html→『C++ iteator const を使ったプログラムがコンパイルできない』 ・あと C++ については、『猫でもわかるプログラミング』よりも下の参考リンクも読んだ方が 理解しやすいと思います。 参考リンク: ・http://www.asahi-net.or.jp/~yf8k-kbys/newcpp0.html→『C++入門』 ・http://www5c.biglobe.ne.jp/~ecb/cpp/cpp00.html→『C++入門』 ・http://www.cmagazine.jp/src/kinjite/cpp/index.html→『プログラミングの禁じ手Web版 C++編』
その他の回答 (2)
- isle
- ベストアンサー率51% (77/150)
ostream,ios,iostreamの前にもstd::を付けてください。 例、ostream → std::ostream あるいは、includeディレクティブのあとに using namespace std; という一行を入れてください。 この場合、他の"std::"も要らなくなります。 #include <iostream.h> と #include <iostream> ではC++として別物になります。 前者は古い(規格が曖昧な頃の)書き方で、現在では後者が正しい記述になります。
補足
返答ありがとうございました。 丁寧に解説いただき、理解することができました。 ありがとうございました。
- MrBan
- ベストアンサー率53% (331/615)
最近の正しいC++標準では、std::の名前空間を指定する必要がありますが、 猫が書かれた当時は、書かずに動く処理系(古いVC等)が使われており、 このようなことがおきます。(猫のサイトにも説明があります) iosやhex、iostreamなどは全て、std::ios、std::hex、std::iostreamでなければならず、 ゆえにエラーになっています。 地道にstd::をつけるのも一手。 横着するならincludeの後くらいに using namespace std; と書く手もあります。 (但し、むやみにこれを書くのはお勧めしません。勉強でちょっと使う分にはありだと思いますけど) > また、エラーとは別の質問になってしまいますが、 いいえ。 1.そのメンバ関数ではクラスのメンバを変更しない。 2.そのメンバ関数は、constなインスタンスに対して呼び出せる の両方の意味を包含します。
お礼
丁寧に解説いただきありがとうございました。 stdとios, hexなどの解説や、最後のconstの意味まで教えていただき感謝します^^
お礼
返答ありがとうございました。 constについての参考サイト、またこれからC++を学ぶに当たり参考になるサイトを紹介いただきありがとうございました。 C++入門・・・・参考にあげていただいたサイトのほうが学びやすいですね。 コンパイラ関係で、ソースが違ってくるようなこともなさそうです。 ありがとうございました。参考にさせてもらいます。