2009-06-26 8 views
1

J'essayais d'utiliser un ensemble de fonctions de filtrage pour exécuter la routine appropriée, basée sur une entrée de chaîne. J'ai essayé de créer des fonctions de matcher pour des cas courants en utilisant des modèles, mais j'obtiens une erreur "type différent du type" quand j'essaie de stocker un pointeur sur la fonction spécialisée (dans une structure, dans l'application réelle)Comment faire un pointeur vers une fonction template spécialisée sur une chaîne?

Distillée par exemple à partir d'une 'application console' Visual C++ 8

template <const char *C> 
const char* 
f(void) { 
    return C; 
} 

const char* (*g)(void) = f<"hi">; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    return g(); 
} 

Cela échoue avec l'erreur

Error 1 error C2440: 'initializing' : cannot convert from 'const char *(__cdecl *)(void)' to 'const char *(__cdecl *)(void)' c:\files\pointer.cpp 7 

(Il a également une erreur sur la valeur principale de retour, mais cela ne me concerne pas ici.

Le même exemple réussit si const char * est remplacé par int.

+0

Savez-vous que vous pouvez le compiler en faisant des char gs [] = "hi"; const char * (* g) (vide) = f ; –

+0

J'ai trouvé une référence à l'utilisation de variables nommées, mais cela détruirait la table concise que je vais utiliser; mieux vaut ajouter la chaîne à la table et la passer à la fonction. En fait, j'ai juste utilisé une chaîne if/else. –

Répondre

2

Les chaînes comme paramètres de valeur de modèle sont interdites par la norme ISO.

+0

Informations supplémentaires: Les paramètres de valeur de modèle doivent être des types intégrés intégrés. – rlbond

+0

Ça pue. Donc, le message d'erreur; ^) –

+1

@Mr. Bond: Mais les pointeurs sont des types entiers. Le problème avec les littéraux de chaîne est que deux chaînes équivalentes qui résident dans différentes unités de compilation peuvent avoir des adresses différentes, créant deux instanciations de modèle différentes. – eduffy

Questions connexes