首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >矢量中的自动指针(smart)

矢量中的自动指针(smart)
EN

Stack Overflow用户
提问于 2013-06-24 17:01:12
回答 3查看 757关注 0票数 1

我在解决下面的代码时遇到了麻烦。我知道由于拷贝问题,auto_ptr不能在STL中使用。但是我也不能使用C++11 unique_ptr解决这个问题。你能帮我解决这个问题吗?

错误:

代码语言:javascript
复制
    $ g++ -std=c++0x autoinvec.cpp
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/unique_ptr.h: In copy constructor âvna_data::vna_data(const vna_data&)â:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/unique_ptr.h:214: error: deleted function âstd::unique_ptr<_Tp, _Tp_Deleter>::unique_ptr(const std::unique_ptr<_Tp, _Tp_Deleter>&) [with _Tp = MyClass, _Tp_Deleter = std::default_delete<MyClass>]â
autoinvec.cpp:11: error: used here
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/unique_ptr.h:214: error: deleted function âstd::unique_ptr<_Tp, _Tp_Deleter>::unique_ptr(const std::unique_ptr<_Tp, _Tp_Deleter>&) [with _Tp = MyClass, _Tp_Deleter = std::default_delete<MyClass>]â
autoinvec.cpp:11: error: used here
autoinvec.cpp: In function âint main()â:
autoinvec.cpp:39: note: synthesized method âvna_data::vna_data(const vna_data&)â first required here
autoinvec.cpp:39: error:   initializing argument 1 of âvoid Usethis::pushmydata(VNADATA)â
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/unique_ptr.h: In member function âvna_data& vna_data::operator=(const vna_data&)â:
autoinvec.cpp:11:   instantiated from âvoid std::vector<_Tp, _Alloc>::_M_insert_aux(__gnu_cxx::__normal_iterator<typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::pointer, std::vector<_Tp, _Alloc> >, _Args&& ...) [with _Args = vna_data, _Tp = vna_data, _Alloc = std::allocator<vna_data>]â
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/vector.tcc:100:   instantiated from âvoid std::vector<_Tp, _Alloc>::emplace_back(_Args&& ...) [with _Args = vna_data, _Tp = vna_data, _Alloc = std::allocator<vna_data>]â
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_vector.h:747:   instantiated from âvoid std::vector<_Tp, _Alloc>::push_back(_Tp&&) [with _Tp = vna_data, _Alloc = std::allocator<vna_data>]â
autoinvec.cpp:27:   instantiated from here
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/unique_ptr.h:219: error: deleted function âstd::unique_ptr<_Tp, _Tp_Deleter>& std::unique_ptr<_Tp, _Tp_Deleter>::operator=(const std::unique_ptr<_Tp, _Tp_Deleter>&) [with _Tp = MyClass, _Tp_Deleter = std::default_delete<MyClass>]â
autoinvec.cpp:11: error: used here
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/unique_ptr.h:219: error: deleted function âstd::unique_ptr<_Tp, _Tp_Deleter>& std::unique_ptr<_Tp, _Tp_Deleter>::operator=(const std::unique_ptr<_Tp, _Tp_Deleter>&) [with _Tp = MyClass, _Tp_Deleter = std::default_delete<MyClass>]â
autoinvec.cpp:11: error: used here
In file included from /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/vector:69,
                 from autoinvec.cpp:3:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/vector.tcc: In member function âvoid std::vector<_Tp, _Alloc>::_M_insert_aux(__gnu_cxx::__normal_iterator<typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::pointer, std::vector<_Tp, _Alloc> >, _Args&& ...) [with _Args = vna_data, _Tp = vna_data, _Alloc = std::allocator<vna_data>]â:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/vector.tcc:314: note: synthesized method âvna_data& vna_data::operator=(const vna_data&)â first required here

代码:

代码语言:javascript
复制
#include<iostream>
#include<memory>
#include<vector>
using namespace std;

class MyClass {
public:
 MyClass() { cout << "Myclass const" << endl; }
};

typedef struct vna_data {
 string i;
 auto_ptr<MyClass> ap1;
 auto_ptr<MyClass> ap2;
 string j;
 string m;
} VNADATA;

class Usethis {
 vector<VNADATA> _data;
public:
 Usethis() {cout << "Usethis const" << endl; }
 void pushmydata (VNADATA d);
};

void Usethis::pushmydata(VNADATA d) {
 _data.push_back(d);
}

int main () {

 Usethis u;
 VNADATA da;
 da.i = "one";
 da.j = "two";
 da.m = "three";
 da.ap1 = new MyClass();
 da.ap2 = new MyClass();
 u.pushmydata(da);

 return 0;
}

使用Unique_ptr编写代码:

代码语言:javascript
复制
#include<iostream>
#include<memory>
#include<vector>
using namespace std;

class MyClass {
public:
 MyClass() { cout << "Myclass const" << endl; }
};

typedef struct vna_data {
 string i;
 unique_ptr<MyClass> ap1;
 unique_ptr<MyClass> ap2;
 string j;
 string m;
} VNADATA;

class Usethis {
 vector<VNADATA> _data;
public:
 Usethis() {cout << "Usethis const" << endl; }
 void pushmydata (VNADATA d);
};

void Usethis::pushmydata(VNADATA d) {
 _data.push_back(move(d));
}

int main () {

 Usethis u;
 VNADATA da;
 da.i = "one";
 da.j = "two";
 da.m = "three";
 da.ap1.reset( new MyClass );
 da.ap2.reset( new MyClass );
 u.pushmydata(da);

 return 0;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-24 17:24:30

我认为如果你使用std::shared_ptrstd::make_shared,你的生活会变得更容易。

代码语言:javascript
复制
#include<iostream>
#include<memory>
#include<vector>
using namespace std;

class MyClass {
public:
 MyClass() { cout << "Myclass const" << endl; }
};

typedef struct vna_data {
 string i;
 shared_ptr<MyClass> ap1;
 shared_ptr<MyClass> ap2;
 string j;
 string m;
 vna_data(shared_ptr<MyClass> ap1, shared_ptr<MyClass> ap2) : ap1(ap1), ap2(ap2) {

 }
} VNADATA;

class Usethis {
 vector<VNADATA> _data;
public:
 Usethis() {cout << "Usethis const" << endl; }
 void pushmydata (VNADATA d);
};

void Usethis::pushmydata(VNADATA d) {
 _data.push_back(d);
}

int main () {

 Usethis u;
 VNADATA da(std::make_shared<MyClass>(), std::make_shared<MyClass>());
 da.i = "one";
 da.j = "two";
 da.m = "three";
 u.pushmydata(da);
}
票数 0
EN

Stack Overflow用户

发布于 2013-06-24 17:14:53

unique_ptr是可移动的,但不可复制。您的Usethis::pushmydata方法接受一个VNADATA by value,该方法试图复制unique_ptr,因此它会中断。

编译器指示您在第39行使用pushmydata方法:

代码语言:javascript
复制
autoinvec.cpp: In function int main():
autoinvec.cpp:39: note: synthesized method vna_data::vna_data(const vna_data&) first required here
autoinvec.cpp:39: error:   initializing argument 1 of void Usethis::pushmydata(VNADATA)

要解决您的问题,请将Usethis::pushmydata的签名更改为;

代码语言:javascript
复制
void Usethis::pushmydata(VNADATA&& d)
票数 1
EN

Stack Overflow用户

发布于 2013-06-24 17:46:42

你的最后一行:

代码语言:javascript
复制
u.pushmydata(da);

需要拷贝。您应该像前面一样在此处使用move:

代码语言:javascript
复制
u.pushmydata(std::move(da));

它会让代码编译。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17271647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档