我有以下shared_ptr
到map
:
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)的其他变体但没有成功。
有人可以帮忙吗?
答案 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==
,不同的字节序列可以表示相同的浮点值。