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

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

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

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

解決済

VC++ エラー:削除された関数を参照しようとしています

robomoco
robomoco

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1回答

0評価

0クリップ

130閲覧

投稿2019/05/07 16:45

main.cpp28行目で,Codewriterオブジェクトcodewriter生成時のコンストラクタに,Parserオブジェクトparserを引数にとったところでエラーが出ました。
原因と解決方法が分かりません。

#出力

1>------ ビルド開始: プロジェクト: VM_Inverter, 構成: Debug Win32 ------ 1>Main.cpp 1>c:\users\ken\documents\nand2tetris\projects\07\virtualmachine\vm_inverter\main.cpp(28): error C2280: 'Parser::Parser(const Parser &)': 削除された関数を参照しようとしています 1>c:\users\ken\documents\nand2tetris\projects\07\virtualmachine\vm_inverter\parser.h(31): note: コンパイラが 'Parser::Parser' をここに生成しました。 1>c:\users\ken\documents\nand2tetris\projects\07\virtualmachine\vm_inverter\parser.h(31): note: 'Parser::Parser(const Parser &)': function was implicitly deleted because a データ メンバー invokes a deleted or inaccessible function 'std::basic_ifstream<char,std::char_traits<char>>::basic_ifstream(const std::basic_ifstream<char,std::char_traits<char>> &)' 1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\fstream(944): note: 'std::basic_ifstream<char,std::char_traits<char>>::basic_ifstream(const std::basic_ifstream<char,std::char_traits<char>> &)': 関数は明示的に削除されました 1>プロジェクト "VM_Inverter.vcxproj" のビルドが終了しました -- 失敗。 ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

#main.cpp

C++

#include <iostream> #include "Parser.h" #include "CodeWriter.h" using namespace std; int main() { Parser parser; parser.advance(); //cout << parser.commandType() << endl; cout << parser.arg1() << endl; parser.advance(); //cout << parser.commandType() << endl; cout << parser.arg1() << endl; cout << parser.arg2() << endl; parser.advance(); //cout << parser.commandType() << endl; cout << parser.arg1() << endl; parser.advance(); //cout << parser.commandType() << endl; cout << parser.arg1() << endl; cout << parser.arg2() << endl; CodeWriter codewriter(parser); }

#Parser.h

c++

#pragma once #include <fstream> #include <sstream> #include <string> #include <iostream> enum comType{ C_ERROR, C_ARITHMATIC, C_PUSH, C_POP, C_LABEL, C_GOTO, C_IF, C_FUNCTION, C_RETURN, C_CALL }; class Parser { public: std::string infilename; Parser(); //読みこみファイルを開く void advance(); //次のコマンドを読みこむ comType commandType(); //コマンドのタイプを返す std::string arg1(); //現コマンドの1番目の引数を返す int arg2(); //現コマンドの2番目の引数を返す std::ifstream ifs; std::string curcmd; //現在コマンド };

#Parser.cpp

c++

#include "Parser.h" using namespace std; //クラスParserの実装 Parser::Parser() { cin >> infilename; ifs.open(infilename); while(ifs.fail()) { cin >> infilename; ifs.open(infilename); } } void Parser::advance() { getline(ifs, curcmd); while (curcmd[0] == ' ') { curcmd.erase(curcmd.begin()+0); } while (curcmd[0] == '\0') { advance(); } } comType Parser::commandType() { //cout << curcmd << endl; string curcmdope = curcmd; curcmdope = curcmdope.substr(0, curcmd.find(" ")); if (curcmdope == "add" || curcmdope == "sub" || curcmdope == "neg" || curcmdope == "eq" || curcmdope == "qt" || curcmdope == "lt" || curcmdope == "and" || curcmdope == "or" || curcmdope == "not") { return C_ARITHMATIC; } else if (curcmdope == "push") { return C_PUSH; } else if (curcmdope == "pop") { return C_POP; } else { return C_ERROR; } } string Parser::arg1() { string curcmdarg1 = curcmd; if (commandType() == C_RETURN) { cout << "C_RETURNは呼ぶな" << endl; return curcmd; } else if (commandType() == C_ARITHMATIC) { return curcmd; } else if (commandType() == C_PUSH || commandType() == C_POP) { while (curcmdarg1[0] != ' ') { curcmdarg1.erase(curcmdarg1.begin() + 0); } while (curcmdarg1[0] == ' ') { curcmdarg1.erase(curcmdarg1.begin() + 0); } curcmdarg1 = curcmdarg1.substr(0, curcmdarg1.find(" ")); return curcmdarg1; } else { cout << "そのようなコマンドは存在しない" << endl; } } int Parser::arg2() { string curcmdarg2 = curcmd; if (commandType() == C_PUSH || commandType() == C_POP || commandType() == C_FUNCTION || commandType() == C_CALL) { while (curcmdarg2[0] != ' ') { curcmdarg2.erase(curcmdarg2.begin() + 0); } while (curcmdarg2[0] == ' ') { curcmdarg2.erase(curcmdarg2.begin() + 0); } while (curcmdarg2[0] != ' ') { curcmdarg2.erase(curcmdarg2.begin() + 0); } while (curcmdarg2[0] == ' ') { curcmdarg2.erase(curcmdarg2.begin() + 0); } curcmdarg2 = curcmdarg2.substr(0, curcmdarg2.find(" ")); //cout << "curcmdarg2 " << curcmdarg2 << endl; return stoi(curcmdarg2); } }

#CodeWriter.h

C++

#pragma once #include <fstream> #include <sstream> #include <string> #include <iostream> class CodeWriter { public: std::string outfilename; CodeWriter(Parser parser); //出力先ファイルを開く void setFileName(std::string fileName); void writeArithmatic(std::string command); void writePushPop(std::string command, std::string segment, int index); void close(); std::ofstream ofs; };

#CodeWriter.cpp

C++

#include "Parser.h" #include "CodeWriter.h" CodeWriter::CodeWriter(Parser parser) { outfilename = parser.infilename; outfilename.erase(outfilename.find(".") + 1, outfilename.find(".") + 3); outfilename += "hack"; ofs.open(outfilename); }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。