为什么我可以将boost map_list_of传递给接受map而不是构造函数的函数?
Why can I pass a boost map_list_of to a function that takes a map, but not a constructor?
我试图构建一个以std::map
为参数的对象,通过使用boost map_list_of
传递它的映射内容。
这给出了一个编译错误,然而,当我尝试对一个接受std::map
的常规函数做同样的事情时,它编译得很好!
#include <map>
#include <boost/assign.hpp>
struct Blah
{
Blah(std::map<int, int> data) {}
};
void makeBlah(std::map<int, int> data) {}
int main()
{
Blah b(boost::assign::map_list_of(1, 2)(3, 4)); // Doesn't compile.
makeBlah(boost::assign::map_list_of(1, 2)(3, 4)); // Compiles fine!
}
我得到的编译错误是:
error: call of overloaded ‘Blah(boost::assign_detail::generic_list<std::pair<int, int> >&)’ is ambiguous
note: candidates are: Blah::Blah(std::map<int, int, std::less<int>, std::allocator<std::pair<const int, int> > >)
note: Blah::Blah(const Blah&)
歧义是什么,为什么它不影响makeBlah中的常规函数,据我所知,它与Blah构造函数具有相同的签名?
有没有更好的方法来实现这一点,短makeBlah
函数将构造一个Blah
的对象,因为它看起来像我将不得不这样做?
(顺便说一句,我是在使用map_list_of
的单元测试中这样做的,以使测试输入数据的创建更具可读性)
map_list_of
不创建容器,但它创建了一个
匿名列表,可以转换为任何标准容器
通过模板用户定义的转换操作符完成转换:
template< class Container >
operator Container() const;
因此,在构造函数的上下文中,它不能推断是转换为map<int, int>
还是Blah
。为了避免这种情况,例如,您可以添加一个虚拟构造函数参数:
class Blah
{
public:
Blah(std::map<int, int> data, int)
{
}
};
void makeBlah(std::map<int, int> data)
{
}
void myTest()
{
Blah b(boost::assign::map_list_of(1, 2)(3, 4), 0);
makeBlah(boost::assign::map_list_of(1, 2)(3, 4));
}
有了makeBlah
,你就没有这样的歧义了。
Blah
中使用它:
class Blah
{
public:
Blah(decltype(boost::assign::map_list_of(0, 0)) data)
: m(data.to_container(m))
{
}
std::map<int, int> m;
};
自从c++11出现以来,boost::assign
已经不再像以前那么引人注目了。
Blah b({{1, 2},{3, 4}});
相关文章:
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- 静态 std::map instatiation 在类的方法中调用构造函数吗?
- 通过构造函数插入 std::map
- 在构造函数初始值设定项中使用 Map 的初始值设定项列表
- 在 std::map 中插入对象时构造函数中变量的地址
- std::map 在 [] 上调用默认构造函数,在 insert() 上调用复制构造函数
- 正确的友元定义,以授予 std::map 对私有默认构造函数的访问权限
- std::map<int, A> 运算符 [] 需要使用空构造函数创建 A
- 为什么 std::map 的移动构造函数不是 noexcept?
- 为什么 std::map emplace 需要在 gcc 上有一个复制构造函数
- 为什么C++允许类型没有 std::map 的默认构造函数,而没有 std::p air
- STD :: MAP EMPLECE通过显式构造函数失败
- C++ 接受对抽象类的常量引用的构造函数无法初始化 std::map
- 与 map 一起使用时复制构造函数常量错误
- 为什么map的元素不需要复制或移动构造函数,而vector需要?
- STD :: MAP初始化列表构造函数
- 类似于类中的 std::map 或 std::vector 的构造函数
- 访问std :: MAP中的静态构造函数New New拨号
- 使用struct插入std::map失败,出现构造函数错误
- 通过引用将 std::map 传递给不更新映射的类的构造函数