2016-06-10 47 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)); 
相關問題