2013-07-20 56 views
1

我在Ubuntu 12.04 x64上,使用Eclipse Indigo w/CDT插件,而我的g ++版本是4.7.3。我已經將編譯器選項-std=c++11和相同的選項添加到發現選項中(即使代碼在寫入時沒有自動完成)。編譯器選項不適用於無序集C++ 11功能

Eclipse以紅色突出顯示了以下部分,並給出警告。但是,程序運行時(忽略錯誤)將打印預期結果(Compiled with gcc 4.7\n 1 0\n)。我該如何解決這個問題?

#include <unordered_set> 
#include <iostream> 
using namespace std; 

int main() 
{ 
    unordered_set<int> s; // Symbol unordered_set cannot be resolved 
    cout << "Compiled with gcc " << __GNUC__ << '.' << __GNUC_MINOR__ << endl; 
    s.insert(0); // Method insert cannot be resolved 
    s.insert(1); // Method insert cannot be resolved 
    s.insert(0); // Method insert cannot be resolved 
    for(auto i = s.begin(); i != s.end(); ++i) cout << ' ' << (*i); 
     // Method begin and end cannot be resolved 
    cout << endl; 
    return 0; 
} 

這是Eclipse在命令行調用:

...$ gcc -E -P -v -dD -std=c++11 .../specs.c 
Using built-in specs. 
... 
gcc version 4.7.3 (Ubuntu/Linaro 4.7.3-2ubuntu1~12.04) 

(無論如何,它應該沒有必要存在)關閉我C編譯-std=c++11編譯器選項後 - 保管它用於C++編譯器,打印到控制檯的輸出如下。

...$ g++ -E -P -v -dD -std=c++11 .../specs.cpp 
Using built-in specs. 
... 
gcc version 4.7.3 (Ubuntu/Linaro 4.7.3-2ubuntu1~12.04) 

而且,不管錯誤的Eclipse顯示我的,輸出還是一樣,表現出無序的作品和被正確編譯。這顯然只是構建之前的一個問題。如果我的索引器在構建之前沒有正確解析,那麼這個集合在運行時如何工作?

+0

可能你安裝了多個版本的GCC,並且Eclipse以某種方式最終使用了錯誤的版本? (在你的代碼中插入類似'std :: cout <<「編譯的gcc」<< __GNUC__ <<'。'<< __GNUC_MINOR__ << std :: endl;'以便輸出用於編譯它的GCC版本。 ) – jogojapan

+0

@jogojapan是的,我確實安裝了多個版本的GCC,但是你的代碼返回「Compiled with gcc 4.7」 - 應該有C++ 11,對嗎? – VF1

+0

是的,沒錯。從4.7開始,C++ 11選項確實是「-std = C++ 11」(在4.6和更早的版本中它曾經是「-std = C++ 0x」)。所以,我不知道爲什麼它不起作用。 – jogojapan

回答

0

我放棄了,因爲根本沒有別的辦法可以做,清除了我的日食系統和我的~/.eclipse文件夾,下載了開普勒及其CDT版本,現在一切正常。

0

您正在使用的編譯器可能不包含對C++ 11的支持,請檢查您的手冊頁或IDE文檔,它會告訴您是否有支持。

+0

我的g ++和gcc版本也是4.7.3,所以它們都應該至少支持'unordered_set' – VF1

+0

我在Mac OS X上編譯的GCC/G ++ 4.7.1當然可以用'-std = C++ 11'並接受你的原始代碼。機器上有多個版本的G ++嗎? Eclipse是否使用您期望的版本?嘗試給選項添加'-v';它報告了許多關於編譯器正在做什麼的信息。 –

+0

@JonathanLeffler請回答我對jogojapan問題本身的評論 – VF1

0

你的問題是,該文件的擴展名是.c而不是.cpp(或.cc),導致它與gcc而不是g++進行編譯。

這意味着它被視爲純粹的C代碼而不是C++ 11,這使得它不會令人驚訝,它不會編譯。

+0

不,不幸的是我可以確認我的文件名是'main.cpp',Eclipse將這個擴展名識別爲C++源代碼。另外,無序集合按預期工作。這只是構建之前的一個問題。 – VF1

+0

這就是事情 - 它_does_編譯!它並沒有運行在舊版本的編譯代碼上 - 添加一個's.insert(2)',果然,輸出'2 1 0'。 – VF1