VC++のコンパイルエラーについて

このQ&Aのポイント
  • VC++のコンパイルエラーについて、エラーメッセージの解釈と解決方法がわかりません。
  • VC++でコンパイルする際に発生したエラーについて、原因と解決方法を教えてください。
  • 現在、VC++でコンパイルしている際にエラーメッセージが表示され、解決方法がわかりません。
回答を見る
  • ベストアンサー

VC++ のコンパイルエラーについて

現在、解説書に記載されているコードをVC++でコンパイルできるか試しながらC++を独習中です。エラーの原因と対応が分からず困っております。どなかたご教示よろしくお願いします。 日付を表示するプログラムで米国表示か英国表示にするか列挙型の宣言と静的メンバーをヘッダーファイルに記載し、フラッグの定義と初期化をするプログラムをコンパイルしました。 ---クラス定義(ファイル名:date.h)--- #include <iostream.h> class date{ ----------------------- enum Lang {USA, UK}; static Lang format; public: ----------------------- }; ---メンバー関数定義(ファイル名:date.cpp)--- #include <string.h> #include <ctype.h> #include <stdlib.h> #include "date.h" ----------------------- Lang date::format = USA; ----------------------- ---------------------------------------- このファイルをコンパイルした結果、下記のエラーメッセージが表示されました。 エラー発生箇所は上記「Lang date::format = USA;」でした --------------------構成: date - Win32 Debug-------------------- コンパイル中... date.cpp date.cpp(17) : error C2501: 'Lang' : 識別名を宣言するのに、型が指定されていません。 date.cpp(17) : error C2239: 無効なトークン 'tag::id' が 'Lang' の宣言の後にあらわれました。 date.cpp(17) : error C2321: 構文エラー : 予期しない 'date::format' です。 cl.exe の実行エラー date.obj - エラー 3、警告 0 ----------------------------------------------------------------------------- エラーの原因と解決方法が分かりません。 よろしくお願いします。

  • s2355
  • お礼率100% (2/2)

質問者が選んだベストアンサー

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

C++に詳しい人から回答付くと思われますが…… >enum Lang {USA, UK}; クラスdateの中の列挙型です。 グローバルな状態で存在する列挙型ではないので、 >Lang date::format = USA; だけでは、どこのLang? ってことになりませんか?

s2355
質問者

お礼

言われると納得しました。コンパイルできました。ありがとうございました。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

直接の回答は #1 の通り (ただし右辺の USA にもスコープが必要) なんだけど, もし本当に #include <iostream.h> なんて書いてあるんだとしたらそんな「解説書」は焚書の対象にしてください. いまどきそんな書き方はしません.

s2355
質問者

お礼

言われると納得しました。コンパイルできました。ありがとうございました。

関連するQ&A

  • VC++でコンパイルできてg++でコンパイルできない

    VC++6.0でコーディングしてコンパイル→実行できたのでLinuxにソースを移してg++でコンパイルしてみました。ところがコンパイルで (中略) InFunction 'App::App[not-in-charge]()' undefined reference to 'MyClass::MyClass[in-charge]()' と言うメッセージが表示されコンパイルできません。 ソースを簡単に書くと、 /***** main.cpp *****/ #include "App.h" App app; int main() { } /***** App.h *****/ #inndef __APP_H_ #define __APP_H_ #include "MyClass.h" class App { MyClass *obj; public: App(); }; #endif /***** App.cpp *****/ #include "App.h" App::App() { obj = new MyClass(); } /***** MyClass.h *****/ #ifndef __MYCLASS_H_ #define __MYCLASS_H_ class MyClass { public: MyClass(); } #endif /***** MyClass.cpp *****/ #include "MyClass.h" MyClass:MyClass(){} と言った具合です。エラーメッセージはAppがMyClassのコンストラクタがどういったものか判らない旨を通知しているのだと思うのですが#includeはきちんと行われているように見られます。 コンパイル順かとも考え g++ main.cpp App.cpp MyClass.cpp g++ main.cpp MyClass.cpp App.cpp と試してみましたが同様の現象です。凡ミスかとは思うのですがなかなか客観的に見られず困っています。

  • コンパイルできません

    #include<iostream> using namespase std; int main(){ double feet; do{ cout<<"フィート数を入力する(0で終了):"; cin<<feet; cout<<feet*12<<"インチ\n"; }while(feet!=0.0); return 0; } をVisual Studio 2008 コマンドプロンプトでコンパイルしようとしたら、このようなメッセージが出てコンパイルできません。何故なのでしょうか?よろしくお願いします。 sample1-3-2.cpp C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\xlocale(342) : warning C 4530: C++ 例外処理を使っていますが、アンワインド セマンティクスは有効にはなりま せん。/EHsc を指定してください。 sample1-3-2.cpp(2) : error C2146: 構文エラー : ';' が、識別子 'std' の前に必要で す。 sample1-3-2.cpp(2) : error C2873: 'namespase' : シンボルを using 宣言の中で使用 することはできません。 sample1-3-2.cpp(2) : error C4430: 型指定子がありません - int と仮定しました。メ モ: C++ は int を既定値としてサポートしていません sample1-3-2.cpp(2) : error C2365: 'std' : 再定義; 以前の定義は '名前空間' でした 。 sample1-3-2.cpp(7) : error C2065: 'cout' : 定義されていない識別子です。 sample1-3-2.cpp(8) : error C2065: 'cin' : 定義されていない識別子です。 sample1-3-2.cpp(9) : error C2065: 'cout' : 定義されていない識別子です。

  • コンパイルエラー

    //test.cpp #include<iostream> #include<string> class test { string hoge; public: test(string str); void method() const; } 14行目  test::test(string str) : test(hoge){} void test::method() const { std::cout << "test" << std::endl; } int main() { string s; std::cout << "名前を入力してください。" << std::endl; std::cin >> s; test aaa(s); aaa.method(); } コンパイルしようとすると下記エラーになります。 エラー E2303 test.cpp 7: 型名が必要 エラー E2139 test.cpp 7: 宣言に ; がない エラー E2293 test.cpp 10: ) が必要 エラー E2147 test.cpp 14: 引数宣言は 'string' で始められない エラー E2111 test.cpp 14: ここでは型 'test' は定義できない エラー E2136 test.cpp 14: コンストラクタには戻り型は指定できない エラー E2316 test.cpp 14: 'test::test(int)' は 'test' のメンバーではない エラー E2451 test.cpp 22: 未定義のシンボル string(関数 main() ) エラー E2379 test.cpp 22: ステートメントにセミコロン(;)がない(関数 main() ) エラー E2451 test.cpp 24: 未定義のシンボル s(関数 main() ) *** 10 errors in Compile *** ■1.型名が必要 →string hoge;と宣言してる箇所でエラー発生。 …stringと宣言してるのになぜでしょうか… ■2.宣言に";"がない →string hoge;と宣言してる箇所でエラー発生。 …";"つけてるのですが… ■3.")"が必要 →test(string str);の行でエラー発生。 …")"はどこで必要なのでしょうか ■4.引数宣言はstringでははじめられない →test::test(string str) : test(hoge){}の行でエラー発生。 …C++って引数をstringで受け取れない…?どういうことでしょうか などなど疑問がいっぱいあるのですが、どこが間違っているのかよくわかりません…ご指導よろしくお願いします。

  • ソースファイルの分割について

    a.h クラスの定義 a.cpp クラスのメンバ関数の定義 b.h #include "a.h" クラスの定義 b.cpp クラスのメンバ関数の定義 ----c.cpp---- #include "a.h" #include "b.h" a.hで定義したクラスの宣言 b.hで定義したクラスの宣言 メインの処理 ----------------------------------------- b.cppで定義しているクラスのメンバ関数にて a.cppで定義したクラスのメンバ変数にアクセスしたいのです。 どうするのが一番良いのでしょうか? a.cppにメンバ変数を返すだけの関数を定義してb.cppでc.cppで宣言したa.hのクラスを extern宣言してみたのですがエラーが出てコンパイルが通らないです。

  • VC++のエラー

    windows xp VC++ 6.0 http://www.kumei.ne.jp/c_lang/intro/no_57.htm に書いてある通りに、タイプをwin32 Application で 設定して、 #include <windows.h> int WINAPI WinMain( HANDLE hInstance , HANDLE hPrevInstance , LPSTR lpCmdLine , int nCmdShow ) { MessageBox(NULL, (LPCSTR)"メッセージ・ボックスのテストです。", (LPCSTR)"猫でもわかるプログラミング", MB_OK); return 0; } をプロジェクトに追加し、ビルドすると、 ******************************** --------------------構成: aaadf - Win32 Debug-------------------- コンパイル中... fdfdfdf.cpp D:\VC\aaadf\fdfdfdf.cpp(7) : error C2731: 'WinMain' : 関数はオーバーロードできません。 D:\VC\aaadf\fdfdfdf.cpp(5) : 'WinMain' の宣言を確認してください。 cl.exe の実行エラー fdfdfdf.obj - エラー 1、警告 0 ********************************* とエラーになります。 何がいけないのかさっぱりわかりません。。

  • 多重定義が起きている?--lnk2005エラー:VC++

    今つまずいている問題は、VC++2008環境下で、以下のような構造になっているプログラムにおいて、多重定義?されているのでコンパイルが通らないというものです。 ソースコードを載せることは大きすぎてできないので、問題となる部分の記述のみ抽出して書きます。 -------define.h---------- ・・・・(module.h内の関数に使われる型の定義など) --------------------------- -------module.h---------- #include "define.h" void mod_1(void){・・・} void mod_2(void){・・・} --------------------------- このように、2つのヘッダーファイルがあり、define.hをインクルードしてmodule.hを使うという構造です。 (一般的ではないようですが、module.h内にmod_1やmod_2の実体を書き込んでいます。) その中で、以下のようなcppソースファイルがあります。 -------Main.cpp---------- #include "module.h"   (他のMain.cpp内の関数の都合上、Main.cppでもmodule.hをインクルードしています。関係あるかもしれないと思い書きました。) int main(){ M(); N(); } ------------------------ -------M.cpp---------- #include "module.h" void M(void){ mod_1(); mod_2(); } ---------------------- -------N.cpp---------- #include "module.h" void N(void){ mod_1(); mod_2(); } ---------------------- とすると、コンパイルの結果は次のようになります。 1>N.obj : error LNK2005: "void __cdecl mod_1(void)" (?mod_1@@YAXXZ) は既に M.obj で定義されています。 1>N.obj : error LNK2005: "void __cdecl mod_2(void)" (?mod_2@@YAXXZ) は既に M.obj で定義されています。 多重定義や多重インクルードは起こしていないと思っていますが、M.cppとN.cpp内の定義が衝突する理由がわかりません。どなたか理由が思いつく方、教えていただけたら幸いです。お願いいたします!! ◆◆◆   ◆◆◆   ◆◆◆   ◆◆◆   ◆◆◆ ちなみに、たとえばMやNとまったく同じ「A.cpp」を作り、このように書いたとします。 -------A.cpp---------- #include "module.h" void A(void){ mod_1(); mod_2(); } ---------------------- そしてmain関数の中に、MやNと同様に『A();』を付け加えたとします。 すると、実行結果はこのようになります。 1>M.obj : error LNK2005: "void __cdecl mod_1(void)" (?mod_1@@YAXXZ) は既に A.obj で定義されています。 1>M.obj : error LNK2005: "void __cdecl mod_2(void)" (?mod_2@@YAXXZ) は既に A.obj で定義されています。 1>N.obj : error LNK2005: "void __cdecl mod_1(void)" (?mod_1@@YAXXZ) は既に A.obj で定義されています。 1>N.obj : error LNK2005: "void __cdecl mod_2(void)" (?mod_2@@YAXXZ) は既に A.obj で定義されています。 VC++はファイル名のアルファベット順にコンパイルするようですが、どちらにせよmain関数内で呼び出されていること以外何の関わりも無いはずのA、M、Nの中での出来事が、衝突する理由が、調べども思い当たりません。 お願いいたします。

  • コンパイルできない・・。(VC++初心者です)

    VC++初心者です。 MS VC++6.0を使用しています。 プロジェクト(Win32 console application)を新規作成して,以下のソースファイル2つとヘッダファイル1つを作成して,コンパイルしたところ インクルード ファイルがオープンできません。'kneko.h': No such file or directoryとエラーが表示されます. 3つのファイルがリンクできてないのでしょうか? また,ヘッダファイルを選択,表示させてコンパイルしようとすると kneko.h の拡張子に関連したコンパイラツールがないためにコンパイルできないと警告されます。 どこが間違っているのでしょうか?よろしくおねがいします。 test.cpp ------------------------------------------------- #include <iostream> #include <cstdio> #include "kneko.h" using namespace std; int main(){ kneko x( "tama" ); x.naku(); } ------------------------------------------------- kneko.h ------------------------------------------------- #ifndef __kneko_h #define __kneko_h #include <iostream> #include <string> using namespace std; class kneko { string name; public: kneko(){}; kneko( string n ); void setname( string n ); void naku() const; }; #endif ------------------------------------------------- kneko.cpp ------------------------------------------------- #include "kneko.h" kneko::kneko( string n ){ name = n; } void kneko::setname( string n ){ name = n; } void kneko::naku() const { cout << "My name is " << name << "." << endl; } -------------------------------------------------

  • コンパイルエラーについて

    現在、大学でステッピングモーターの制御についてのプログラミングについて学んでいます。 コンパイルエラーについてお力をお貸しいただけたら幸いです。 環境は windows7 VC++6.0 を使っています。 ///Motorprogram #include "Svcpp.cpp" #define JOG_P 0x32 //定速連続+方向の定義 ///X軸(定速連続+方向) //flag=ppd3test('X','+'); //動作可否の判断 if(!flag){ w_p234.axis ='X'; w_p234.cmd = jog_p; //定速連続+方向 w_p234.spd = 25; //25pps flag = hp234_writ(&w_p234); //動作開始指令 } エラーは以下の通りです。 motor-2011.cpp C:\Users\hikari\Desktop\motor-program\motor-2011.cpp(130) : error C2501: 'flag' : 識別名を宣言するのに、型が指定されていません。 C:\Users\hikari\Desktop\motor-program\motor-2011.cpp(130) : error C2065: 'ppd3test' : 定義されていない識別子です。 C:\Users\hikari\Desktop\motor-program\motor-2011.cpp(131) : error C2143: 構文エラー : ';' が 'if' の前に必要です。 C:\Users\hikari\Desktop\motor-program\motor-2011.cpp(131) : error C2143: 構文エラー : ';' が '{' の前に必要です。 C:\Users\hikari\Desktop\motor-program\motor-2011.cpp(131) : error C2447: グローバルスコープで中カッコ ({) が見つかりましたが、対応する関数ヘッダーがありません。 cl.exe の実行エラー motor-2011.obj - エラー 5、警告 0 includeについてはきちんと読み込んでいるので問題ないかと思います。 パルス出力ボードについては HPC-PPD234 を使用しています。 コマンドはマニュアルに沿ったものを使っています。 よろしくお願いいたします。

  • 分割コンパイルの方法がわかりません‥(Studio.NET)

    mainとsubという2つのcppファイルと各ヘッダファイルで分割コンパイルを試みましたがうまくいきません・・。 何が間違っているのでしょう・・。 エラーメッセージ error LNK2005: "char * a" (?a@@3PADA)は既にmain.objで定義されています。 fatal error LNK1169: 1つ以上の複数回定義されているシンボルが見つかりました。 と表示されます。ファイルソースは以下です。どなたか教えてください>< ----------(main.h)---------- char a[100]; ----------(main.cpp)---------- #include<stdio.h> #include "main.h" #include "sub.h" int main(){  sprintf(a,"hello.");  sub_write();  return 0; } -----------(sub.h)----------- void sub_write(); -----------(sub.cpp)------------- #include <stdio.h> #include "main.h" #include "sub.h" void sab(){  printf("%s\n",a); } return; }

  • C++のコンパイルエラーが

    おこります。 --------------------------------- #include <stdio.h> int main(void) { printf("hello, world\n"); return 0; } -------------------------------------- をコンパイルするのですができません。 以下のエラーが出ます。 --------------------------------------- エラー E2209 sample.c 1: インクルードファイル 'stdio.h' をオープンできない 警告 W8065 sample.c 5: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main ) *** 1 errors in Compile *** -------------------------------------

専門家に質問してみよう