我試圖通過使用boost map_list_of
將地圖內容傳遞給一個參數來構造一個對象,該對象將std::map
作爲參數。爲什麼我可以將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&)
什麼歧義,以及怎麼來的,不影響常規functoin makeBlah,其中據我所看到的,具有相同的簽名作爲Blah構造函數?
有沒有一種更好的方法來實現這一點,短缺makeBlah
函數將構造一個對象Blah
,因爲它看起來像我將不得不做的?
(順便說一句,我使用map_list_of
使測試輸入數據創建更可讀的這樣做在單元測試)
雖然如果你可以使用'decltype()',你可以轉儲boost代碼並使用'initializer_list'初始化映射。 –