質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Q&A

解決済

2回答

4780閲覧

C++ クラスメンバにifstreamを使うとエラーが生じます

robomoco

総合スコア31

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

0グッド

0クリップ

投稿2019/05/05 04:05

まだ作りかけのプログラムですが,試しに実行してみたところ,以下のエラーが出てきました。
クラスのメンバにstringやifstreamは使えないのでしょうか?

1>------ ビルド開始: プロジェクト: VM_Inverter, 構成: Debug Win32 ------ 1>Main.cpp 1>c:\users\ken\documents\nand2tetris\projects\07\virtualmachine\vm_inverter\parser.h(24): error C3646: 'ifs': 不明なオーバーライド指定子です 1>c:\users\ken\documents\nand2tetris\projects\07\virtualmachine\vm_inverter\parser.h(24): error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 1>c:\users\ken\documents\nand2tetris\projects\07\virtualmachine\vm_inverter\parser.h(25): error C3646: 'curcmd': 不明なオーバーライド指定子です 1>c:\users\ken\documents\nand2tetris\projects\07\virtualmachine\vm_inverter\parser.h(25): error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 1>Parser.cpp 1>c:\users\ken\documents\nand2tetris\projects\07\virtualmachine\vm_inverter\parser.h(24): error C3646: 'ifs': 不明なオーバーライド指定子です 1>c:\users\ken\documents\nand2tetris\projects\07\virtualmachine\vm_inverter\parser.h(24): error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 1>c:\users\ken\documents\nand2tetris\projects\07\virtualmachine\vm_inverter\parser.h(25): error C3646: 'curcmd': 不明なオーバーライド指定子です 1>c:\users\ken\documents\nand2tetris\projects\07\virtualmachine\vm_inverter\parser.h(25): error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 1>c:\users\ken\documents\nand2tetris\projects\07\virtualmachine\vm_inverter\parser.cpp(9): error C2065: 'ifs': 定義されていない識別子です。 1>c:\users\ken\documents\nand2tetris\projects\07\virtualmachine\vm_inverter\parser.cpp(10): error C2065: 'ifs': 定義されていない識別子です。 1>c:\users\ken\documents\nand2tetris\projects\07\virtualmachine\vm_inverter\parser.cpp(13): error C2065: 'ifs': 定義されていない識別子です。 1>c:\users\ken\documents\nand2tetris\projects\07\virtualmachine\vm_inverter\parser.cpp(19): error C2065: 'ifs': 定義されていない識別子です。 1>c:\users\ken\documents\nand2tetris\projects\07\virtualmachine\vm_inverter\parser.cpp(19): error C2065: 'curcmd': 定義されていない識別子です。 1>c:\users\ken\documents\nand2tetris\projects\07\virtualmachine\vm_inverter\parser.cpp(20): error C2065: 'curcmd': 定義されていない識別子です。 1>c:\users\ken\documents\nand2tetris\projects\07\virtualmachine\vm_inverter\parser.cpp(21): error C2065: 'curcmd': 定義されていない識別子です。 1>c:\users\ken\documents\nand2tetris\projects\07\virtualmachine\vm_inverter\parser.cpp(27): error C2065: 'curcmd': 定義されていない識別子です。 1>コードを生成中... 1>プロジェクト "VM_Inverter.vcxproj" のビルドが終了しました -- 失敗。 ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

Main.cpp

C++

1 2#include <iostream> 3#include "Parser.h" 4 5using namespace std; 6 7int main() 8{ 9 Parser parser; 10 parser.advance(); 11 parser.commandType(); 12 parser.advance(); 13 parser.commandType(); 14 parser.advance(); 15 parser.commandType(); 16}

Parser.h

C++

1#pragma once 2#include <fstream> 3#include <sstream> 4#include <string> 5#include <iostream> 6 7enum comType{ 8 C_ARITHMATIC, 9 C_PUSH, 10 C_POP, 11 C_LABEL, 12 C_GOTO, 13 C_IF, 14 C_FUNCTION, 15 C_RETURN, 16 C_CALL 17}; 18class Parser { 19public: 20 Parser(); //読みこみファイルを開く 21 void advance(); //次のコマンドを読みこむ 22 int commandType(); //コマンドのタイプを返す 23 ifstream ifs; 24 string curcmd; //現在コマンド 25};

Paser.cpp

C++

1#include "Parser.h" 2using namespace std; 3 4//クラスParserの実装 5Parser::Parser() 6{ 7 string infilename; 8 cin >> infilename; 9 ifs.open(infilename); 10 while(ifs.fail()) { 11 12 cin >> infilename; 13 ifs.open(infilename); 14 } 15} 16 17void Parser::advance() 18{ 19 getline(ifs, curcmd); 20 while (curcmd[0] == ' ') { 21 curcmd.erase(0); 22 } 23} 24 25int Parser::commandType() 26{ 27 cout << "curcmd" << curcmd << endl; 28 29}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ぱっと見、ifstream → std::ifstream , string → std::string かな?

投稿2019/05/05 04:39

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pepperleaf

2019/05/05 06:36

> using namespace std; の有効範囲が、インクルードファイル (Parser.h)に無い、という事ですね。 その結果、該当箇所の宣言が無効となる。 その変数の参照も同様にって事でしょうか? これだけでは、ちょっと分かりにくい。
episteme

2019/05/05 06:52 編集

なんにせよヘッダで using namespace はお行儀悪い。ならば std:: 付けるっきゃないよね。 # class-scopeでusing...するってテもあるにはあるけど
robomoco

2019/05/05 12:02

ご回答いただきありがとうございました。
guest

0

前述のepistemeさんの回答に補足します。
ヘッダーファイルでusing namespace std;を行っているのが問題です。

ヘッダーファイルでusing namespace;を行うと
インクルードしているすべてのファイルでusing namespace std; が適用され、
不測のエラーがよく起きます。
(※詳しくはこちら

あと、int Parser::commandType()で戻り値を返していませんよ。

投稿2019/05/05 05:17

tarot_shogun

総合スコア29

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LouiS0616

2019/05/05 05:44

ヘッダファイルで using namespace std は行っていないように見えますが。
tarot_shogun

2019/05/05 06:14

完全に見間違いでした。すいません。回答は取り下げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問