2011-03-08 48 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