【问题标题】:error C2039: 'string' : is not a member of 'std', header file problemerror C2039: 'string' : is not a member of 'std',头文件问题
【发布时间】:2011-03-08 12:01:55
【问题描述】:

我正在写的课程有问题。我已将该类拆分为一个定义该类的 .h 文件和一个实现该类的 .cpp 文件。

我在 Visual Studio 2010 Express 中收到此错误:

error C2039: 'string' : is not a member of '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++ 程序中处理多个文件的提示。

【问题讨论】:

  • 可能您的意思是“声明一个类”而不是“定义”。

标签: c++ class visual-studio-2010 header-files


【解决方案1】:

注意不要包含

#include <string.h> 

但只有

#include <string>

我花了 1 个小时才在我的代码中找到它。

希望对你有帮助

【讨论】:

    【解决方案2】:

    你需要有

    #include <string>
    

    在头文件中也是如此。仅靠前向声明是不够的。

    还强烈考虑对头文件进行标头保护,以避免将来随着项目的增长可能出现问题。所以在顶部做这样的事情:

    #ifndef THE_FILE_NAME_H
    #define THE_FILE_NAME_H
    
    /* header goes in here */
    
    #endif
    

    这将防止头文件被多次#included,如果你没有这样的保护,那么你可能会遇到多个声明的问题。

    【讨论】:

    • "你也需要在头文件中包含#include 。"哇,这似乎违反了语言规则!包含头文件在语义上应该等同于将所有内容都放在同一个文件中;。
    • @userX 这是因为前向声明是针对string 的类。这与std::string相同,因此当它在std 命名空间中查找string 时找不到符号。
    • 至少这违反了最小惊讶法则。用户希望 #include 包含字符串的定义。在 C# 中你永远不会看到这种废话。
    【解决方案3】:

    您的 FMAT.h 需要定义 std::string 才能完成 FMAT 类的定义。在 FMAT.cpp 中,您已在 #include "FMAT.h" 之前通过 #include &lt;string&gt; 完成此操作。您还没有在主文件中这样做。

    您转发声明string 的尝试在两个级别上不正确。首先,您需要一个完全限定名称std::string。其次,这只适用于指针和引用,不适用于声明类型的变量;前向声明没有为编译器提供足够的信息来说明要在您定义的类中嵌入什么。

    【讨论】:

    • 谢谢马克,将#include 放在.h 文件中解决了这个问题。随着这个程序的大小增加,我会通过将#include 放在头文件中来遇到问题吗?我听说#includes 应该全部放在 .cpp 文件中。是否有适当的方法来构建程序,以便以后不会遇到多个定义问题。现在存在的程序(在头文件中带有#include)结构是否正确?
    • 一种解决方案是依赖&lt;string&gt; 并强制包含FMAT.h 的每个源也包含它。每个包含文件都应包含保护措施,以防止多次定义,即使包含多次。
    • @Cal 如果可能的话,将包含放入 .cpp 文件中通常是一种很好的做法。然而,这不是一个可以在任何地方都适用的规则。有多种情况是不可能的。这是其中之一。
    猜你喜欢
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 2021-04-22
    相关资源
    最近更新 更多