ошибка C2039: «строка»: не является членом «std», проблема с файлом заголовка - PullRequest
29 голосов
/ 26 июня 2010

У меня проблемы с классом, который я пишу. Я разделил класс на файл .h, который определяет класс, и файл .cpp, который реализует класс.

Я получаю эту ошибку в Visual Studio 2010 Express:

ошибка C2039: «строка»: не является членом «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 ++.

Ответы [ 3 ]

25 голосов
/ 26 июня 2010

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

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

24 голосов
/ 26 июня 2010

Вам также необходимо иметь

#include <string>

в заголовочном файле. Самого предварительного объявления недостаточно, чтобы сделать это.

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

#ifndef THE_FILE_NAME_H
#define THE_FILE_NAME_H

/* header goes in here */

#endif

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

2 голосов
/ 16 августа 2018

Не включайте

#include <string.h> 

но только

#include <string>

Мне понадобилось 1 час, чтобы найти это в моем коде.

Надеюсь, что это может помочь

...