web-dev-qa-db-ja.com

エラーC2039: 'string': 'std'のメンバーではありません、ヘッダーファイルの問題

書いているクラスに問題があります。クラスを、クラスを定義する.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++プログラムで複数のファイルを処理する方法に関するヒントを提供してください。

29
Cal

あなたが持っている必要があります

#include <string>

ヘッダーファイルにもあります。それ自体の前方宣言だけでは十分ではありません。

また、ヘッダーファイルのヘッダーガードを強く検討して、プロジェクトの成長に伴う将来的な問題を回避してください。そのため、上部で次のようなことを行います。

#ifndef THE_FILE_NAME_H
#define THE_FILE_NAME_H

/* header goes in here */

#endif

これにより、ヘッダーファイルが複数回#includeされるのを防ぐことができます。このようなガードがない場合、複数の宣言で問題が発生する可能性があります。

25
shuttle87

FMAT.hには、クラスFMATの定義を完了するためにstd :: stringの定義が必要です。 FMAT.cppでは、#include <string>の前に#include "FMAT.h"でこれを実行しています。メインファイルでまだ実行していません。

stringを転送宣言する試みは、2つのレベルで正しくありませんでした。最初に、完全修飾名std::stringが必要です。次に、これはポインターと参照に対してのみ機能し、宣言された型の変数に対しては機能しません。前方宣言では、定義しているクラスに何を埋め込むかについての十分な情報がコンパイラに提供されません。

25
Mark Ransom

含めないように注意してください

#include <string.h> 

だけ

#include <string>

私のコードでこれを見つけるのに1時間かかりました。

これが役立つことを願っています

2
Stephane