web-dev-qa-db-fra.com

erreur C2039: 'chaîne': n'est pas membre de 'std', problème de fichier d'en-tête

J'ai des problèmes avec un cours que j'écris. J'ai divisé la classe en un fichier .h qui définit la classe et un fichier .cpp qui implémente la classe.

Je reçois cette erreur dans Visual Studio 2010 Express:

erreur C2039: 'chaîne': n'est pas membre de 'std'

Ceci est l'en-tête FMAT.h

class string;

class FMAT {
public:
    FMAT(); 

    ~FMAT(); 

    int session();              

private:
    int manualSession();    
    int autoSession();      

    int     mode;       
    std::string instructionFile;    

};

Il s'agit du fichier d'implémentation 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;
}

c'est le fichier principal qui utilise cette classe

#include "FMAT.h"

int main(void)
{
    FMAT fmat;      //create instance of FMAT class

    fmat.session();     //this will branch to auto session or manual session

}

Mon incapacité à corriger cette erreur est probablement due au fait que je ne comprends pas comment structurer correctement une classe dans des fichiers séparés. N'hésitez pas à fournir quelques conseils sur la façon de gérer plusieurs fichiers dans un programme c ++.

29
Cal

Vous devez avoir

#include <string>

dans le fichier d'en-tête également. La déclaration directe ne suffit pas.

Envisagez également fortement les protections d'en-tête pour vos fichiers d'en-tête afin d'éviter d'éventuels problèmes futurs à mesure que votre projet se développe. Donc, en haut, faites quelque chose comme:

#ifndef THE_FILE_NAME_H
#define THE_FILE_NAME_H

/* header goes in here */

#endif

Cela empêchera le fichier d'en-tête d'être inclus # plusieurs fois, si vous n'avez pas un tel garde, vous pouvez avoir des problèmes avec plusieurs déclarations.

25
shuttle87

Votre FMAT.h nécessite une définition de std :: string afin de compléter la définition de la classe FMAT. Dans FMAT.cpp, vous avez fait cela par #include <string> avant #include "FMAT.h". Vous ne l'avez pas fait dans votre fichier principal.

Votre tentative de transfert de déclaration string était incorrecte à deux niveaux. Vous avez d'abord besoin d'un nom complet, std::string. Deuxièmement, cela ne fonctionne que pour les pointeurs et les références, pas pour les variables du type déclaré; une déclaration directe ne donne pas au compilateur suffisamment d'informations sur les éléments à intégrer dans la classe que vous définissez.

25
Mark Ransom

Veillez à ne pas inclure

#include <string.h> 

mais, seulement

#include <string>

Il m'a fallu 1 heure pour trouver cela dans mon code.

J'espère que cela peut vous aider

2
Stephane