2010-08-24 40 views
5

Tôi nhận được lỗi lạ này trong g ++; nó biên dịch tốt trong Visual Studio.lỗi: không có chức năng phù hợp cho cuộc gọi đến 'make_pair (int &, Quest *)'

struct Quest 
{ 
    static map<int, Quest*> Cache; 
}; 

Quest *Quest::LoadFromDb(BaseResult& result, int *id) 
{ 
    Quest *ret; 
    if(result.Error()) 
    { 
     if(id) 
      Cache.insert(make_pair<int, Quest*>(*id, NULL)); // <--- Problematic line 

     return NULL; 
    } 

// ... 
} 

chính xác lỗi:

DataFilesStructure.cpp:9135:58: error: no matching function for call to 'make_pair(int&, Quest*)'

Trả lời

6

Ứng dụng có hoạt động với dàn diễn viên rõ ràng không?

if (id) 
    Cache.insert(make_pair<int, Quest*>(int(*id), NULL)); 

Ngoài ra, tệp cpp với 9000 dòng, thực sự?

+0

Nó được tạo tự động và có, int() dường như sửa nó !! – Krevan

+0

@Krevan: Vui vì tôi có thể giúp. – fredoverflow

+0

Điều gì đã xảy ra ở đây? Chúng ta có một cá thể hàm mẫu rõ ràng 'make_pair Kos

-1

NULL không phải là một Quest* - nó có thể được được định nghĩa là ((void *) 0) nơi nào đó, mà không phải là mặc nhiên chuyển đổi thành Quest*. Sử dụng static_cast<Quest*>(0) để thay thế.

+0

Nó không nhưng nó có thể được chuyển đổi sang một, 'Quest * a = NULL' chẳng hạn .. Và tôi liệt kê một cách rõ ràng các tham số mẫu. Dù sao tôi đã cố gắng, cùng một lỗi. – Krevan

+0

@Krevan: Không, có thể * không thể * được chuyển đổi thành một. –

+0

@Billy: Không phải 'NULL' được định nghĩa là' 0' trong C++? – fredoverflow

1

Đơn giản chỉ cần loại bỏ các thông số mẫu:

Cache.insert(make_pair(*id, NULL)); 

này cần khắc phục vấn đề của bạn.

+0

Điều này đã giúp tôi. C++ 11 không yêu cầu tham số mẫu. – sgowd

15

Có thể bạn đang sử dụng phiên bản C++ 0x của thư viện libstdC++. C++ 0x tuyên bố make_pair như

template <class T1, class T2> 
pair<V1, V2> make_pair(T1&& x, T2&& y) noexcept; 

Nếu T1int, sau đó xint&&, và do không thể lấy lvalues ​​loại int. Khá rõ ràng, make_pair được thiết kế để được gọi là không rõ ràng mẫu đối số

make_pair(*id, NULL) 
+0

@Krevan Nếu tôi có biến số nguyên i. Tôi muốn ghép nối với i và một đối tượng khác. Làm thế nào chính xác tôi nên gọi là tuyệt vọng. 1) make_pair <*i, obj> 2) int && j = i; make_pair ? Cả hai đều không hoạt động. Whats cách chính xác để làm điều đó? – PHcoDer

0

Nếu một giá trị NULL đang cần cho giá trị 2, có lẽ một chuyển đổi loại rõ ràng là cần thiết:

return make_pair((node)NULL,(node)NULL); // NULL value 
return make_pair((node *)NULL,(node *)NULL); // NULL pointer value 
0

này có thể được sắp hơi muộn cho các bạn nhưng có thể hữu ích cho người khác.

Đã chính xác cùng một vấn đề:

strVar= ... 
newNode= ... 
static map<string, Node*> nodes_str; 
nodes_str.insert(make_pair(strVar, newNode)); // all OK 

để

intVar= ... 
newNode= ... 
static map<int, Node*> nodes_int; 
nodes_int.insert(make_pair(intVar, newNode)); // compile error 

giải quyết nó bằng cách thêm:

using std::make_pair; 
Các vấn đề liên quan