Подтвердить что ты не робот

Ошибка 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

}

Моя неспособность исправить эту ошибку, вероятно, является результатом того, что я не понимаю, как правильно структурировать класс в отдельные файлы. Не стесняйтесь приводить несколько советов о том, как обрабатывать несколько файлов в программе на С++.

4b9b3361

Ответ 1

Для того, чтобы завершить определение класса FMAT, для вашего FMAT.h требуется определение std::string. В FMAT.cpp вы сделали это с помощью #include <string> до #include "FMAT.h". Вы не сделали этого в своем основном файле.

Ваша попытка переслать объявление string была неверна на двух уровнях. Сначала вам нужно полное имя, std::string. Во-вторых, это работает только для указателей и ссылок, а не для переменных объявленного типа; передняя декларация не дает компилятору достаточной информации о том, что вставлять в класс, который вы определяете.

Ответ 2

Вам нужно

#include <string>

в файле заголовка тоже. Прямое объявление на нем не делает достаточно.

Также настоятельно рекомендуется защищать заголовок для файлов заголовков, чтобы избежать возможных будущих проблем по мере роста вашего проекта. Итак, наверху сделайте что-нибудь вроде:

#ifndef THE_FILE_NAME_H
#define THE_FILE_NAME_H

/* header goes in here */

#endif

Это предотвратит многократное включение заголовочного файла, если у вас нет такого защитника, тогда у вас могут быть проблемы с несколькими объявлениями.