2010-11-22 8 views
0

Dans le code ci-dessous:problème étrange avec la conversion

template<class Key, class Value> 
    class Pair 
    { 
    private: 
     std::pair<Key,Value> body_; 
    public: 
     //No cpy ctor - this generated by compiler is OK 
     Pair(Key&& key,Value&& value) 
     { 
      body_.first = key; 
      body_.second = value; 
     } 

     Pair(Pair<Key,Value>&& tmpPattern) 
     { 
      body_.swap(tmpPattern.body_); 
     } 

     Pair& operator=(Pair<Key,Value> tmpPattern) 
     { 
      body_.swap(tmpPattern.body_); 
      return *this; 
     } 

       }; 

    template<class Key, class Value> 
    Pair<Key,Value> MakePair(Key&& key, Value&& value) 
    { 
     return Pair<Key,Value>(key,value); 
    } 

Pour une raison bizzare je reçois une erreur lorsque je tente de lancer MakePair, pourquoi? Dieu sait ...

int main(int argc, char** argv) 
{ 
auto tmp = MakePair(1, 2); 
} 

C'est cette erreur:
erreur Erreur C2665: Paire :: Paire ': aucun des 3 pourrait convertir tous les surcharges les types d'arguments

Je ne juste' t comprendre quelle conversion il doit y avoir?

+0

Avec '&&', n'est-il pas nécessaire que les paramètres de la fonction soient des références? –

+0

@Victor, non '&&' peut prendre des valeurs –

+0

Quoi qu'il en soit, cela compile bien pour moi sur GCC 4.3.2. Cependant, comme il n'y a pas encore de support pour 'auto', j'ai dû le remplacer par' Pair tmp = MakePair (1, 2) '. Pourrait-il être votre compilateur a tout simplement un bug C++ 0x support? –

Répondre

0

return Pair<Key,Value>(std::forward<Key>(key),std::forward<Value>(value));

Bien que je ne suis pas vraiment sûr pourquoi le transfert rvalue n'est pas implicite.

Edit: Oh, je suppose que je l'ai eu. De cette façon, vous pouvez toujours passer une référence rvalue à une fonction qui prend de la valeur.

+0

merci cela fonctionne mais maintenant j'ai rencontré un problème que lorsque je veux passer des variables au lieu de constantes, je reçois une autre erreur. Une idée pourquoi? –

+0

@There Eh bien, dans ce cas, vous devriez utiliser 'std :: move'. Les Lvalues ​​ne peuvent implicitement se désintégrer en rvalues, ce serait assez fou (perdre la propriété en passant une variable dans une fonction): -D –

+0

tu veux dire std :: move au lieu de std :: forward? –

0

Vous devez transmettre des valeurs à MakePair, et non des types. Essayez ceci:

int a = 1; 
int b = 2; 
auto tmp = MakePair(a, b); // creates a Pair<int,int> with the values of a and b 
+0

toujours pas de go (erreur différente) mais si je passe à la place de MakePair (a, b) ce MakePair (1,2) je reçois la même erreur que précédemment. –