2010-09-10 6 views
2

J'ai écrit le code suivant sur VC10. Appeler f1 est correct, mais en appelant f2 le compilateur a montré une erreur. La différence entre les deux fonctions est seulement "template", mais le type de template n'est pas utilisé. Pourquoi l'erreur se produit-elle?Passage d'un lambda à une fonction modèle sur VC10

#include <functional> 

void f1(std::tr1::function<void()> f) 
{ 
} 

template <typename > 
void f2(std::tr1::function<void()> f) 
{ 
} 

int main() 
{ 
    f1([]{}); 
    f2([]{}); // Error C2783 
} 

Je comprends maintenant l'erreur sur le premier code. Que diriez-vous du code suivant? Est-ce la raison de l'erreur que le compilateur ne peut pas décider du type de template car lambda génère une classe anonyme interne, mais elle est différente de std :: tr1 :: function?

#include <functional> 

class MyClass 
{ 
}; 

template <typename T> 
void f2(std::tr1::function<void(T)> f) 
{ 
} 

int main() 
{ 
    std::tr1::function<void(MyClass)> f= [](MyClass v){}; 

    f2(f); 
    f2([](MyClass v){}); // C2784 
} 

Répondre

5

Ce n'est pas spécifique à lambdas du tout. Vous devez dire au compilateur quelle version du modèle que vous souhaitez appeler:

f2<int>([]{}); 
f2<float>([]{}); 

Peu importe si vous les utilisez ou non. C'est comme les paramètres de fonction inutilisés:

void f(int) { } 
int main() { f(); /* error! */ } 
Questions connexes