添加#include <string> </string>时出现奇怪错误

时间:2011-03-08 20:11:02

标签: c++

我有以下非常简单的应用程序编译并运行良好:

编辑:将示例更改为简化以结束真实问题的混淆

int main() {
    return 0;
}

一旦我添加#include <string>(甚至没有引用std :: string),它就无法编译,我收到以下错误:

/usr/include/c++/4.1.2/bits/allocator.h:82 error: expected template-name before '<' token

还有大约456个其他类似的错误。

有什么想法吗?谢谢!

更新:

/usr/include/c++/4.1.2/bits/allocator.h的第82行引用了错误位置的模板__glibcxx_base_allocator。该模板在bits/c++allocator.h中定义。当我在系统中搜索该文件时,我得到3次点击,但没有一次出现在/usr/include/c++/4.1.2/bits/中,正如人们期望的那样。

我有版本3.1.6,4.1.1和4.3.2,但不是4.1.2,因为我使用的其他包括。我不确定使用哪一个(如果有的话,我没有得到任何错误的未知文件),但似乎问题可能源于此。

5 个答案:

答案 0 :(得分:1)

问题似乎是安装的开发包不正确或不完整(不要与腐败混淆)。强制g ++使用不同的包含版本更正:

g++ -nostdic++ hello.cc -o hello -I/usr/include/c++/3.4.6

所有备用目录(4.1.1,4.1.2和4.3.2)都不完整,导致包含不适当的文件,从而导致异常错误。例如:

/usr/include/c++/4.1.2/bits/allocator.h要求__glibcxx_base_allocator中的bits/c++allocator.h位于/usr/include/c++/4.1.1/usr/include/c++/4.3.2中,并且似乎不兼容。强制编译器使用唯一的完整包含来纠正这一点。

答案 1 :(得分:0)

几乎可以肯定g ++将.cc检测为C源文件,而不是C ++,并将其传递给gcc而不是编译为C ++。您可以通过将文件重命名为hello.C来轻松进行测试。您还可以使用g ++的语言参数。

编辑:这似乎在g ++ 4.2中使用.cc扩展名正常工作,因此可能不是这样。你有没有其他标题包括你没有向我们展示?他们可能会干扰<string>

EDIT2:您的标题可能无法正确设置。这有用吗:

#include <string>
int main()
{
    return 0;
}

答案 2 :(得分:0)

当C ++标准库头文件损坏/未完全安装时,听说会出现这样的错误 - 也许甚至有一条消息引用了456个其他错误中缺少的内容。

在任何情况下,请确保libstdc++-devel,分别为。包含您的发行版的C ++标准库头文件的包已正确安装。

答案 3 :(得分:0)

这可能是在预处理阶段引起的错误。只需通过将标志-E传递给gcc来预处理cpp文件,然后查看编译器抱怨的位置。

答案 4 :(得分:0)

检查您的包含路径。路径可以指定为环境变量或在命令行中指定。您可以使用来自不同编译器的包含文件或同一编译器的不同版本。

另外,请尝试使用<cstdio>而不是<stdio.h>

另一个建议:改变&lt;&gt;至 ””。