2012-12-16 75 views
6

tôi đào lên một dự án cũ và muốn biên dịch nó, nhưng đã nhận được một số lỗi, một vài trong số những trở thành một c2664:c2664 trong Visual Studio 2012 khi sử dụng make_pair

error C2664: 'std::make_pair' : cannot convert parameter 1 from 'CUser *' to 'CUser *&&' 
error C2664: 'std::make_pair' : cannot convert parameter 1 from 'unsigned long' to ' unsigned long &&' 

Các bộ phận mã có liên quan bao gồm:

//typedef for the userdata map 
typedef std::map<unsigned long, std::pair<CUser*,userstatus*>> UserDataMapType; 
//... 
Inc::incret CUserManager::AddUser(unsigned long ID, CUser* pUser, userstatus* pUserStatus) 
{ 
    //... 
    std::pair<UserDataMapType::iterator, bool> ret = m_mapUserData.insert(std::make_pair<unsigned long, std::pair<CUser*, userstatus*>>(ID, std::make_pair<CUser*, userstatus*>(pUser, pUserStatus))); 
    //... 
} 

Tôi đã cố gắng thực hiện các tham số chức năng const, nhưng điều đó không có tác dụng.

Nó đã biên dịch tốt trong VS2010.

Hãy giúp tôi tìm nguyên nhân gây ra điều này và cách giải quyết.

Trả lời

16

make_pair() đã được thay đổi trong VS2012 để hỗ trợ một tính năng mới C++ 11 gọi ngữ nghĩa di chuyển và tôi nghi ngờ rằng việc xác định một cách rõ ràng các loại cho make_pair() là nhận được trong cách.

Hãy nhớ rằng make_pair() không cần bất kỳ thông số mẫu nào được chỉ định rõ ràng. Nó suy ra chúng từ kiểu của mỗi đối số.

Hãy thử loại bỏ các đối số mẫu rõ ràng từ cả hai cuộc gọi đến make_pair() như vậy ...

std::pair<UserDataMapType::iterator, bool> ret = m_mapUserData.insert(std::make_pair(ID, std::make_pair(pUser, pUserStatus))); 

Rõ ràng cung cấp cho họ như thế này sẽ làm việc tốt trước VS2012 vì một tính năng mới C++ 11 thêm vào gọi move semantics. Bạn sẽ muốn đọc về chủ đề đó sau này vì bạn có một trình biên dịch mới sáng bóng hỗ trợ nó.

Các vấn đề liên quan