書いているクラスに問題があります。クラスを、クラスを定義する.hファイルと、クラスを実装する.cppファイルに分割しました。
Visual Studio 2010 Expressでこのエラーを受け取ります。
エラーC2039: 'string': 'std'のメンバーではありません
これはヘッダーFMAT.hです
class string;
class FMAT {
public:
FMAT();
~FMAT();
int session();
private:
int manualSession();
int autoSession();
int mode;
std::string instructionFile;
};
これは実装ファイルFMAT.cppです
#include <iostream>
#include <string>
#include "FMAT.h"
FMAT::FMAT(){
std::cout << "manually (1) or instruction file (2)\n\n";
std::cin >> mode;
if(mode == 2){
std::cout << "Enter full path name of instruction file\n\n";
std::cin >> instructionFile;
}
}
int FMAT::session(){
if(mode==1){
manualSession();
}else if(mode == 2){
autoSession();
}
return 1;
}
int FMAT::manualSession(){
//more code
return 0;
}
これは、このクラスを使用するメインファイルです
#include "FMAT.h"
int main(void)
{
FMAT fmat; //create instance of FMAT class
fmat.session(); //this will branch to auto session or manual session
}
このエラーを修正できないのは、おそらくクラスを個別のファイルに適切に構造化する方法を理解していないためです。 C++プログラムで複数のファイルを処理する方法に関するヒントを提供してください。
あなたが持っている必要があります
#include <string>
ヘッダーファイルにもあります。それ自体の前方宣言だけでは十分ではありません。
また、ヘッダーファイルのヘッダーガードを強く検討して、プロジェクトの成長に伴う将来的な問題を回避してください。そのため、上部で次のようなことを行います。
#ifndef THE_FILE_NAME_H
#define THE_FILE_NAME_H
/* header goes in here */
#endif
これにより、ヘッダーファイルが複数回#includeされるのを防ぐことができます。このようなガードがない場合、複数の宣言で問題が発生する可能性があります。
FMAT.hには、クラスFMATの定義を完了するためにstd :: stringの定義が必要です。 FMAT.cppでは、#include <string>
の前に#include "FMAT.h"
でこれを実行しています。メインファイルでまだ実行していません。
string
を転送宣言する試みは、2つのレベルで正しくありませんでした。最初に、完全修飾名std::string
が必要です。次に、これはポインターと参照に対してのみ機能し、宣言された型の変数に対しては機能しません。前方宣言では、定義しているクラスに何を埋め込むかについての十分な情報がコンパイラに提供されません。
含めないように注意してください
#include <string.h>
だけ
#include <string>
私のコードでこれを見つけるのに1時間かかりました。
これが役立つことを願っています