2016-06-10 51 views
3

我想知道为什么下面的代码是有效的使用std ::对构造函数:Multimap之插入钥匙所属类别用的std :: make_pair VS的std ::对构造

代码:

std::multimap< std::type_index, void * > mm; 
mm.insert(std::pair<std::type_index, void *>(typeid(int), 0)); 

而且给使用std编译时错误:: make_pair:

错误:

C2248 'type_info::type_info' cannot access private member declared in class 'type_info' 

代码:

std::multimap< std::type_index, void * > mm; 
mm.insert(std::make_pair(typeid(int), 0)); 

任何线索?谢谢 !

+0

有什么错'的std :: pair'或'的std :: make_pair'。 'type_info'必须有一个公共构造函数。 –

+1

与你的问题无关,但*为什么*你有一个从'type_info'到'void *'的映射?映射的目的是什么?什么是用例?你有什么问题?对我来说,它的设计很糟糕。 –

+0

由于您使用的是C++ 11,我认为'mm.emplace(typeid(int),0)'会更好。 – user1887915

回答

4

typeid的返回类型是一个std::type_info对象,该对象没有定义构造函数。由于make_pair从传入的参数中推导出其输出对的模板参数,因此推导出std::pair<std::type_info, int>。然后由于上述原因未能创建所需的对。

您的其他行创建带有明确模板参数的对:std::pair<std::type_index, void *>。这一次,你正在创建一个std::type_index对象,其中确实有有一个构造函数,它需要一个std::type_info - 正是你给它的。所以没有问题。

make_pair行将编译,如果它也给予明确的模板参数:

mm.insert(std::make_pair<std::type_index, void *>(typeid(int), 0)); 
相关问题