初始化std :: shared_ptr <std :: map <>&gt;使用braced-init

时间:2016-04-06 08:32:36

标签: c++ c++11 shared-ptr stdmap list-initialization

我有以下shared_ptrmap

std::shared_ptr<std::map<double, std::string>>

我想用braced-init初始化它。有可能吗?

我试过了:

std::string s1("temp");
std::shared_ptr<std::map<double, std::string>> foo = std::make_shared<std::map<double, std::string>>(1000.0, s1);

但是在使用Xcode 6.3编译时出现以下错误:

/usr/include/c++/v1/map:853:14: Candidate constructor not viable: no known conversion from 'double' to 'const key_compare' (aka 'const std::__1::less<double>') for 1st argument

我尝试过第一个参数(1000.0)的其他变体但没有成功。

有人可以帮忙吗?

5 个答案:

答案 0 :(得分:8)

std::map有一个初始化列表构造函数:

map (initializer_list<value_type> il,
     const key_compare& comp = key_compare(),
     const allocator_type& alloc = allocator_type());

我们可以很容易地使用这个构造函数创建一个地图:

std::map<double,std::string> m1{{1000.0, s1}};

要在make_shared中使用它,我们需要指定我们提供的initializer_list实例化:

auto foo = std::make_shared<std::map<double,std::string>>
           (std::initializer_list<std::map<double,std::string>::value_type>{{1000.0, s1}});

看起来很笨拙;但如果你经常需要这个,你可以用别名来整理它:

#include <string>
#include <map>
#include <memory>

std::string s1{"temp"};

using map_ds = std::map<double,std::string>;
using il_ds = std::initializer_list<map_ds::value_type>;

auto foo = std::make_shared<map_ds>(il_ds{{1000.0, s1}});

您可能更喜欢定义模板函数来包装调用:

#include <string>
#include <map>
#include <memory>

template<class Key, class T>
std::shared_ptr<std::map<Key,T>>
make_shared_map(std::initializer_list<typename std::map<Key,T>::value_type> il)
{
    return std::make_shared<std::map<Key,T>>(il);
}

std::string s1{"temp"};
auto foo = make_shared_map<double,std::string>({{1000, s1}});

答案 1 :(得分:1)

您的问题是您实际上没有在初始化程序中添加任何大括号。我需要以下内容才能让它发挥作用:

auto foo = std::make_shared<std::map<double, std::string> >(
                         std::map<double, std::string>({{1000.0, s1}})
           );

std::map<double, std::string>让我感到困惑。考虑到另一个,它真的应该能够解决其中一个......但是gcc 5.3.0不会打球。

你肯定需要双括号。 (一旦说你正在初始化地图,一旦分隔每个条目。)

答案 2 :(得分:1)

您可以在没有std::make_shared的情况下执行此操作:

std::shared_ptr<std::map<double,std::string>> ptr(new std::map<double,std::string>({{1000.0, "string"}}));

答案 3 :(得分:-2)

与此类似的事情应该这样做......

 std::string s1("temp");  

 std::map<double, std::string> *m = new std::map<double, std::string>{{100., s1}};

 auto foo = std::shared_ptr<std::map<double, std::string>>(m);

或作为oneliner

auto foo2 = std::shared_ptr<std::map<double, std::string>>(new std::map<double, std::string>{{100., s1}});

(抱歉,首先错过了初始化列表的要求)

答案 4 :(得分:-4)

更改密钥的类型。

double是键的错误类型,因为它没有operator==,不同的字节序列可以表示相同的浮点值。