我在写作课时遇到问题。我已经将类拆分为一个定义类的.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 ++程序中处理多个文件的一些提示。
答案 0 :(得分:25)
您的FMAT.h需要std :: string的定义才能完成FMAT类的定义。在FMAT.cpp中,您在#include <string>
之前#include "FMAT.h"
完成了此操作。你还没有在你的主文件中这样做。
您在两个级别上转发声明string
的尝试不正确。首先,您需要一个完全限定的名称std::string
。其次,这仅适用于指针和引用,而不适用于声明类型的变量;前向声明不会给编译器足够的信息,说明要在您定义的类中嵌入什么。
答案 1 :(得分:21)
你需要
#include <string>
在头文件中。它自己的前向声明做得不够。
还强烈考虑头文件的标头保护,以避免在项目增长时可能出现的未来问题。所以在顶部做类似的事情:
#ifndef THE_FILE_NAME_H
#define THE_FILE_NAME_H
/* header goes in here */
#endif
这会阻止头文件被多次#included,如果你没有这样的警卫,那么你可能会遇到多个声明的问题。
答案 2 :(得分:1)
请注意不要包含
#include <string.h>
但仅限
#include <string>
我花了1个小时在我的代码中找到它。
希望这会有所帮助