2014-05-02 32 views
2

我使用這個代碼:爲什麼C++ Builder無法編譯這個?

#include <iostream> 
#include <memory> 
#include <vector> 
using namespace std; 

void out(int* p){ 
    cout << *p; 
} 

int main(){ 
    vector<unique_ptr<int> > vInt; 

    for(int i = 0; i < 10; i++) 
     vInt.push_back(unique_ptr<int>(new int(i))); 

    out(vInt[0].get()); // 0 
    return 0; 
} 

如果我使用一些在線編譯它編譯OK,但兩者C++ Builder的XE2和XE6報告錯誤:

[bcc32 Error] vector(1179): E2247 'unique_ptr<int,default_delete<int> >::unique_ptr(const unique_ptr<int,default_delete<int> > &)' is not accessible 
[bcc32 Error] vector(1203): E2247 'unique_ptr<int,default_delete<int> >::unique_ptr(const unique_ptr<int,default_delete<int> > &)' is not accessible 
[bcc32 Error] xutility(1682): E2247 'operator unique_ptr<int,default_delete<int> >::=(const unique_ptr<int,default_delete<int> > &)' is not accessible 
[bcc32 Error] xutility(1552): E2247 'operator unique_ptr<int,default_delete<int> >::=(const unique_ptr<int,default_delete<int> > &)' is not accessible 
[bcc32 Error] xmemory(28): E2247 'unique_ptr<int,default_delete<int> >::unique_ptr(const unique_ptr<int,default_delete<int> > &)' is not accessible 

我用默認的編譯器/ IDE設置做我不知道爲什麼會發生這種情況?

有人有C++ Builder XE3或更高版本確認此問題?

+2

聽起來像是標準庫中的一個bug還是對prvalues的處理?嘗試'vInt.emplace_back()'而不是'vInt.push_back()'。 – tclamb

+0

它不識別emplace_back方法。剛在XE6上試了一下。由於上面的代碼在GNU GCC版本4.7.2上工作,我不明白爲什麼它不會在這裏工作。我認爲這是C++ Builder的問題? – Tracer

+0

就是這樣。看起來C++ Builder沒有實現C++ 11。聽起來像你堅持'std :: auto_ptr'。 – tclamb

回答

2

C++ Builder的32位編譯器不支持C++ 11呢。它的64位編譯器的確如此,因爲它基於Clang 3.1。如果你也不能使用auto_ptr,那麼你的安裝有問題,因爲auto_ptr在兩個編譯器中都能正常工作。

5

這是一個編譯器錯誤/未能正確實現C++ 11標準。 push_back有兩個重載,一個採用const左值引用,另一個右值引用。你的代碼非常好,因爲在vInt.push_back(unique_ptr<int>(new int(i)));中創建的unique_ptr是一個臨時的,它應該綁定到右值引用,然後移入存儲區。

我沒有C++構建器,所以我不知道哪些解決方法可行。如果碰巧實施emplace_back,您可以使用它。否則,您可能會訴諸boost::container::vectorboost.ptr_container

2

感謝@GregorBrandt,我找到了答案。 32位應用程序仍然不支持C++ 11。只適用於64位。

https://forums.embarcadero.com/message.jspa?messageID=596431

http://qc.embarcadero.com/wc/qcmain.aspx?d=114889

+0

向bcc32添加C++ 11支持實際上是Embarcadero QC中最受歡迎的功能請求。雖然我沒有看到它發生,除非他們可以在bcc32的後端使用bcc64的前端。 –

+0

不是,但他們最終發佈了基於clang而不是舊bcc32的單獨的C++ 11 32位編譯器(bcc32c)。 –

+0

請注意[QualityCentral現已關閉](https://community.embarcadero。com/blogs/entry/quality-keeping-moving-forward),所以你不能訪問'qc.embarcadero.com'鏈接了。如果您需要訪問舊的QC數據,請查看[QCScraper](http://www.uweraabe.de/Blog/2017/06/09/how-to-save-qualitycentral/)。 –