2010-08-24 21 views
5

Bu tuhaf hatayı g ++' da alıyorum; Visual Studio'da iyi derler.hatası: 'make_pair (int &, Quest *)' çağrısı için eşleşen işlev yok '

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; 
    } 

// ... 
} 

Tam hatası:

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

cevap

6

Açık bir dökümle çalışıyor mu?

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

Ayrıca, 9000 satırlı bir cpp dosyası, gerçekten?

+0

Otomatik olarak oluşturulur ve evet, int() bunu düzeltmek gibi görünüyor! – Krevan

+0

@Krevan: Memnun olurum. – fredoverflow

+0

Aslında burada ne oldu? 'Make_pair Kos

-1

NULL olmayan bir Quest* - bu örtük Quest* dönüştürülebilir değil bir yere ((boşluk *) 0), olarak tanımlanır ancak olabilir. Bunun yerine static_cast<Quest*>(0) kullanın.

+0

O değil ama biri 'Görevi * a dönüştürülebilir:

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 

ekleyerek çözmüş

için:

tam olarak aynı problem vardı = NULL 'örneğin .. Ve ben şablon parametrelerini açıkça listeliyorum. Her neyse denedim, aynı hata. – Krevan

+0

@Krevan: Hayır, bire dönüştürülemez *. –

+0

@Billy: "NULL", C++ 'da 0 değil olarak tanımlandı mı? – fredoverflow

1

Sadece şablon parametrelerini kaldırın:

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

Bu sorunu çözmek gerekir.

+0

Bu bana yardımcı oldu. C++ 11, şablon paramlarını gerektirmez. – sgowd

15

Büyük olasılıkla libstdC++ kütüphanesinin C++ 0x sürümünü kullanıyorsunuzdur. xint&& o zaman, int ve bunun tip int ait SolDeğerler alamaz make_pairT1 Eğer

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

olarak C++ 0x beyan eder. Çok açıktır ki, make_pair bir NULL değer 2 değeri için ihtiyaç olan

make_pair(*id, NULL) 
+0

@Krevan Bir tamsayı değişkenim varsa i. Ben ve başka bir nesne ile çift yapmak istiyorum. Makepair'i tam olarak nasıl aramalıyım? 1) make_pair <*i, obj> 2) int && j = i; make_pair ? İkisi de çalışmıyor. Bunu yapmanın doğru yolu nedir? – PHcoDer

0

ise açık şablon argümanları olmadan çağrılacak tasarlanmıştır, belki açık bir tür dönüşüm gereklidir: Bu geliyor olabilir

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

Sizin için biraz geç ama diğerleri için yararlı olabilir.

using std::make_pair; 
İlgili konular