2010-08-24 6 views
5

Je reçois cette erreur bizarre en g ++; il compile bien dans Visual Studio.erreur: aucune fonction correspondante pour l'appel à '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; 
    } 

// ... 
} 

erreur exacte:

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

Répondre

6

Est-ce que cela fonctionne avec une distribution explicite?

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

En outre, un fichier cpp avec 9000 lignes, vraiment?

+0

Il est généré automatiquement, et oui, int() semble le réparer !! – Krevan

+0

@Krevan: Content de pouvoir aider. – fredoverflow

+0

Qu'est-ce qui s'est réellement passé ici? Nous avons une instance explicite de fonction de modèle 'make_pair Kos

-1

NULL est pas Quest* - il peut être défini comme étant ((void *) 0) quelque part, ce qui est implicitement convertible en Quest*. Utilisez static_cast<Quest*>(0) à la place.

+0

Ce n'est pas, mais il peut être converti en un, 'Quête * a = NULL par exemple .. Et je liste explicitement les paramètres du template. De toute façon j'ai essayé, même erreur. – Krevan

+0

@Krevan: Non, il est possible que * ne puisse * être converti en un. –

+0

@Billy: NULL n'est-il pas défini comme étant '0' en C++? – fredoverflow

1

Retirez simplement les paramètres du modèle:

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

Cela devrait résoudre votre problème.

+0

Cela m'a aidé. C++ 11 ne nécessite pas les paramètres du modèle. – sgowd

15

Vous utilisez très probablement la version C++ 0x de la bibliothèque libstdC++. C++ 0x déclare make_pair comme

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

Si T1 est int, alors x est int&&, et celui-ci ne peut pas prendre lvalues ​​de type int. De toute évidence, make_pair est conçu pour être appelé sans arguments de modèle explicites

make_pair(*id, NULL) 
+0

@Krevan Si j'ai une variable entière i. Je veux faire une paire avec i et un autre objet. Comment exactement dois-je appeler makepair. 1) make_pair <*i, obj> 2) int && j = i; make_pair ? Les deux ne fonctionnent pas. Quelle est la bonne façon de le faire? – PHcoDer

0

Si une valeur NULL est nécessaire pour la valeur 2, peut-être une conversion de type explicite est nécessaire:

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

Cela peut venir un peu en retard pour vous les gars mais pourrait être utile pour les autres.

eu exactement le même problème:

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 

a résolu le problème en ajoutant:

using std::make_pair; 
Questions connexes