2011-03-08 47 views
0

我有以下非常简单的应用程序,编译和运行良好:奇怪的错误当添加的#include <string>

编辑:改变的例子是simpilar结束,真正的问题

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其他类似的错误。

任何想法?谢谢!

UPDATE:

线/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

另外:我只是用'G ++ hello.cc -o hello'编译,没有什么花哨 – steveo225 2011-03-08 20:11:40

+0

你能张贴失败整个文件? – yan 2011-03-08 20:13:27

+1

'g ++ --version'的输出是什么? – Johnsyweb 2011-03-08 20:13:53

回答

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需要位于bits/c++allocator.h__glibcxx_base_allocator正被包括来自任一/usr/include/c++/4.1.1/usr/include/c++/4.3.2而且似乎是不相容的。强制编译器使用唯一完整的包含解决此问题。

+0

感谢大家的帮助。经过多天的努力寻求答案,我终于想通了,并认为我会分享我的发现。 – steveo225 2011-03-15 17:42:20

+0

有一个错字它的** - nostdinC++ **不 - 非停顿++ – tbozo 2015-08-27 13:09:43

0

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

编辑:这似乎工作正常在g ++ 4.2与.cc扩展,所以可能不是这样。你有没有其他的标题,你没有向我们展示?他们可能会干扰<string>

编辑2:或者您的标题可能没有设置正确。这是否工作:当C++标准库头被损坏/发生

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

我怀疑它,因为它抛出一个关于期待模板名称的错误。另外,.cc是一个常见的C++扩展。 – yan 2011-03-08 20:15:14

+0

我也怀疑它。这不是我的实际应用***震撼***,但我真正的使用类和继承没有问题,似乎是STL – steveo225 2011-03-08 20:17:52

+0

不,其他的包括,并且你的例子也失败了相同的错误。 – steveo225 2011-03-08 20:25:08

0

象这样的错误已经听说过没有完全安装 - 也许甚至有指丢失的456个其他错误中包括的消息。

无论如何,请确保libstdc++-devel,resp。包含您的发行版的C++标准库头文件的包已正确安装。

+0

我最近确定安装了正确的版本,然后重新安装,并没有说光盘上的软件包没有被破坏。另外,我检查了整个构建日志,没有丢失文件的抱怨,大部分错误是'无效使用不确定型“结构的std ::分配器”' – steveo225 2011-03-08 20:23:40

0

这可能是在预处理阶段造成的错误。只需通过将标志-E传递给gcc来预处理您的cpp文件,并查看编译器抱怨的地方。

+0

的我试过了,并得到了大文件的输出,特别是因为应用程序什么都不做。我没有看到前处理器抱怨输出的任何地方,并且没有任何信息发送到stderr,但我确实承认我不熟悉该特定输出。 – steveo225 2011-03-08 21:04:22

+0

我不是说预处理程序错误,而是预处理程序完成工作后引入的错误。如果你有像“#define public private”这样一个愚蠢的宏,只要考虑预处理后会对代码产生什么影响。你的代码可能不会编译。 – dimba 2011-03-08 21:09:01

+0

只需查看/usr/include/c++/4.1.2/bits/allocator.h中的预处理文件行82。比你如果行看起来不一样,冥冥中宏,改变线路 – dimba 2011-03-08 21:12:37

0

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

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

另一个建议:将<>更改为“”。

+0

的问题不在于stdio.h中,工作正常,问题是任何STL包括像串,向量,iostream的等G ++ - 版本报告4.1.2这也是发现包含文件的版本文件夹,所以我非常确定这是匹配。 – steveo225 2011-03-08 21:09:09

+0

@ steveo255:你确定这不是问题所在吗?你有没有尝试过使用这个C++头而不是旧的C头? – Johnsyweb 2011-03-11 09:29:00

+0

问题不在于打印,我改变了这个例子来反映这个(没有更多的stdio。h或printf)。问题是当我包含任何STL头时,它不会编译并生成相同的错误。 – steveo225 2011-03-11 12:48:51