包括<string>,使用不完整类型'std :: string'

时间:2018-08-11 13:54:55

标签: c++

在此示例代码中,<fstream>可以正常工作,但<string>不能:(注释错误)

#include <iostream>
#include <fstream>
#include <string>

int main(){
    using namespace std;
    string line; //incomplete type is not allowed
    ifstream ifile("test.in");
    if(ifile.is_open()){
        while(ifile.good()){
            getline(ifile,line); //identifier "getline" is undefined
        }
    }
}

当我将代码更改为以下内容时,错误getline()变为“ 名称空间“ std”没有成员“ getline” ”:

int main(){
    std::string line; //incomplete type is not allowed
    std::ifstream ifile("test.in");
    if(ifile.is_open()){
        while(ifile.good()){
            std::getline(ifile,line); //namespace "std" has no member "getline"
        }
    }
}

此代码“修复”了string line声明的错误:

std::string* line;

或:

using namespace std;
string* line;

2 个答案:

答案 0 :(得分:0)

我有两次类似的事情。在项目中意外地创建一个空的“ vector”,“ set”,“ map”等文件非常容易,尤其是如果您意外地将源代码粘贴到终端上(幸运的是,我们包含<string>而不是{{ 1}})。

Visual c ++将很乐意使用空标头而不是标准标头,而不会给出任何警告。在解决方案目录中扫描名为vector的文件。

如果这样做没有帮助,Visual Studio会显示一个调试模式,显示所有包含的文件。

如果这是gcc或clang,则可以使用-E标志而不是-c运行编译器。这将创建一个文本文件,其中所有包含的文本都在一个文件中(或在stdout上)。这将为您提供提示。这就是我找到空的“设置”文件的方式。

答案 1 :(得分:0)

感谢大家的帮助。我解决了问题,但我仍然不知道是什么原因。我不知道这是否是编译器的配置(可能不是因为其他头文件工作正常)。我认为编译器没有损坏,因为重新安装后问题仍然存在。

重新安装整个Visual Studio代码并完成重新配置编译器和构建选项后,该问题得到了神奇的解决。