我有以下非常简单的应用程序编译并运行良好:
编辑:将示例更改为简化以结束真实问题的混淆
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,因为我使用的其他包括。我不确定使用哪一个(如果有的话,我没有得到任何错误的未知文件),但似乎问题可能源于此。
答案 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;至 ””。