2017-01-24 4 views
2

Je veux créer un pointeur vers une fonction basé sur un modèle:puis-je créer un pointeur vers une fonction de modèle dans une étendue?

template <class T> 
void foo(T x){} 

int main() 
{ 


template <class T> 
void (*ptr)(T); 


    return 0; 
} 

je suis arrivé erreur ci-dessus: error C2951: template declarations are only permitted at global or namespace scope

donc je peux le réparer en déclarant le pointeur de fonction basé sur un modèle dans une portée globale et il fonctionne très bien :

template <class T> 
void foo(T x){ cout << "foo()" << endl;} 

template <class T> 
void (*ptr)(T); 


int main() 
{ 

    ptr = foo; 
    (*ptr)(7); 

    return 0; 
} 
  • est-il un moyen de déclarer un pointeur vers l'intérieur d'une fonction templated portée comme dans le premier code?
+5

Votre second extrait de code ne l'a pas * corrigé *. – WhiZTiM

+4

Les fonctions modèles n'existent même pas tant qu'elles ne sont pas instanciées avec un type, de sorte qu'un pointeur vers un modèle de fonction est impossible. Vous pouvez obtenir des pointeurs vers des instances spécifiques, cependant, comme 0oo' – AndyG

+4

' modèle void (* ptr) (T); 'serait un modèle variable depuis C++ 14. mais l'utilisation serait quelque chose comme 'ptr = foo;'. – Jarod42

Répondre

10

une fonction de modèle est pas une fonction . Et les pointeurs de fonction peuvent uniquement être affectés à des fonctions de signatures correspondantes.

Dans cette déclaration:

template <class T> 
void foo(T x){ cout << "foo()" << endl;} 

foo est une fonction modèle . Jusqu'à ce qu'il soit instancié avant qu'une fonction soit produite. Par conséquent, vous pouvez seulement obtenir un pointeur de fonction à une instanciation de foo.


Supposons que vous avez un pointeur de fonction dire Ktr, vous ne pouvez l'assigner à une instanciation de foo comme ci-dessous:

void (*Ktr)(int); 
Ktr = foo<int>; 

Dans cette déclaration:

template <class T> 
void (*ptr)(T); 

Vous avez déclaré un variable template (C++14) d'un type pointeur de fonction prenant un objet o f tapez T comme seul argument.

+0

Vous pouvez cependant * dans un autre template * instancier le template foo et lui faire un pointeur. Par exemple. 'modèle classe usesFooPtr {void (* ptr) (U) = & foo }' – Caleth

+0

merci qui est un bon et expliquant –