使用boost::shared_ptr<std::list<T>>初始化boost::shared_ptr<std::vector<T>>。

5

我想在构造函数的初始化列表中使用一个 boost::shared_ptr<std::vector<std::string> > vec 的对象,并用一个 boost::shared_ptr<std::list<std::string> > list 对其进行初始化。

这种做法是否可行?

我尝试过这样写:

Test.hpp

class Test
{
public:
    Test(boost::shared_ptr<std::list<std::string> > list);

private:
    boost::shared_ptr<std::vector<std::string> > vec;
};

Test.cpp

Test::Test(boost::shared_ptr<std::list<std::string> > list) : vec(list->begin(), list->end())
{
}

错误信息的一部分:

Test.cpp: In constructor ‘Test::Test(boost::shared_ptr<std::list<std::basic_string<char> > >)’:
Test.cpp:6:85: error: no matching function for call to ‘boost::shared_ptr<std::vector<std::basic_string<char> > >::shared_ptr(std::list<std::basic_string<char> >::iterator, std::list<std::basic_string<char> >::iterator)’

1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Igor R.
2
虽然共享指针到容器有其有效的用例,但您确定在这里需要共享生命周期和动态分配容器吗? - TartanLlama
3
注意:boost::shared_ptr已经过时。请使用C++11标准的功能,即std::shared_ptr - rustyx
我需要使用 boost::shared_ptr,因为我无法访问 C++11 的特性... - tmsblgh
2个回答

9

替换:

vec(list->begin(), list->end())

使用:

vec(boost::make_shared(list->begin(), list->end()))

您的构造函数应该如下所示:
Test::Test(const boost::shared_ptr<std::list<std::string> >& list) :
    vec(boost::make_shared(list->begin(), list->end())){
}

请注意,您正在将数据从std::list复制到std::vector
如果您想要一种更经济的解决方案,可以使用std::make_move_iterator来移动它们。但是,由于您仍在使用boost智能指针,我认为您无法访问它。 编辑: 如果不起作用,请尝试这个:
vec(boost::make_shared<std::vector<std::string>>(list->begin(), list->end()))

编辑 2:

为了涵盖由@Maxim Egorushkin提到的nullptr情况:

class Test{
public:
    Test(const boost::shared_ptr<std::list<std::string> >& list);

private:
    boost::shared_ptr<std::vector<std::string> > convert_to_vec(const boost::shared_ptr<std::list<std::string> >& lst) const;
    boost::shared_ptr<std::vector<std::string> > vec;
};

//in .cpp
Test::Test(const boost::shared_ptr<std::list<std::string> >& list):
    vec(convert_to_vec(list)){
}
boost::shared_ptr<std::vector<std::string> > Test::convert_to_vec(const boost::shared_ptr<std::list<std::string> >& lst) const{
    if(lst!=nullptr){
        return boost::make_shared<std::vector<std::string>>(list->begin(), list->end());
    }
    return nullptr;
}

2
我建议构造函数应该只接受一个 const std::list<std::string>&,因为它不需要知道列表的生命周期。虽然我理解你只是回答问题 :) - TartanLlama
我收到了这个错误信息: Test.cpp: 在构造函数‘Test::Test(const boost::shared_ptr<std::list<std::basic_string<char> > >& )’中: Test.cpp:6:123: 错误:没有找到与‘make_shared(std::list<std::basic_string<char> >::iterator, std::list<std::basic_string<char> >::iterator)’匹配的函数 - tmsblgh
1
尝试使用 boost::make_shared<std::list<std::string>>(list->begin(), list->end()) - TartanLlama
@TartanLlama Test.cpp:在‘Test::Test(const boost::shared_ptr<std::list<std::basic_string<char> > >&)中: Test.cpp:6:149:错误: 没有找到与‘boost::shared_ptr<std::vector<std::basic_string<char> > >::shared_ptr(boost::detail::sp_if_not_array<std::list<std::basic_string<char> > >::type)’相匹配的函数` - tmsblgh
1
boost::shared_ptr<> 可以是 nullptr - Maxim Egorushkin
1
看起来对于一个不执行任何有用功能的代码来说太过复杂了。这是shared_ptr的问题,而不是你的问题。 - Maxim Egorushkin

3
作为附注:目前不清楚构造函数为什么要使用shared_ptr<X>,但是没有使用shared_ptr<X>。应该改为使用X&。如果可能的话,避免使用智能指针。
理想情况下,您的代码应该如下所示:
class Test
{
public:
    Test(std::list<std::string> const& list)
        : vec(list.begin(), list.end())
    {}

private:
    std::vector<std::string> vec;
};

我只需要传递 std::liststd::string& 列表吗?使用 shared_ptr 不是更“安全”和“便宜”吗? - tmsblgh
2
如果可能的话,请传递 std::list<std::string> const& list,避免传递 shared_ptr。如果可能的话,请避免使用 shared_ptr 成员。 - Maxim Egorushkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接