为什么C ++ Builder无法编译呢?

时间:2014-05-02 13:35:02

标签: c++ pointers c++11 vector 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;
}

如果我使用一些在线编译器,它编译正常,但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或更高版本可以确认此问题吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

感谢@GregorBrandt,我找到了答案。 32位应用程序仍然不支持C ++ 11。仅适用于64位。

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

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

答案 2 :(得分:2)

C ++ Builder的32位编译器尚不支持C ++ 11。它的64位编译器,因为它基于Clang 3.1。如果你也不能使用auto_ptr,那么你的安装有问题,因为auto_ptr在两个编译器中都有效。