2010-03-29 6 views
2

J'ai une structure avec un paramètre de modèle, Stream. Dans cette structure, il existe une fonction avec son propre paramètre de modèle, Type.Instanciation explicite d'une fonction membre générique d'une structure générique

Si j'essaye de forcer une instance spécifique de la fonction à être générée et appelée, cela fonctionne bien, si Je suis dans un contexte où le type exact de la structure est connu. Sinon, j'obtiens une erreur de compilation. Cela ressemble à une situation où il me manque un typename, mais il n'y a pas de types imbriqués. Je soupçonne qu'il me manque quelque chose de fondamental, mais je regarde ce code depuis si longtemps que tout ce que je vois sont des rousses, et écrire franchement du code qui utilise des modèles n'a jamais été mon fort.

Ce qui suit est l'exemple le plus simple que j'ai pu trouver pour illustrer le problème.

#include <iostream> 

template<typename Stream> 
struct Printer { 
    Stream& str; 
    Printer(Stream& str_) : str(str_) { } 

    template<typename Type> 
    Stream& Exec(const Type& t) { 
    return str << t << std::endl; 
    } 
}; 

template<typename Stream, typename Type> 
void Test1(Stream& str, const Type& t) { 
    Printer<Stream> out = Printer<Stream>(str); 
    /****** vvv This is the line the compiler doesn't like vvv ******/ 
    out.Exec<bool>(t); 
    /****** ^^^ That is the line the compiler doesn't like ^^^ ******/ 
} 

template<typename Type> 
void Test2(const Type& t) { 
    Printer<std::ostream> out = Printer<std::ostream>(std::cout); 
    out.Exec<bool>(t); 
} 

template<typename Stream, typename Type> 
void Test3(Stream& str, const Type& t) { 
    Printer<Stream> out = Printer<Stream>(str); 
    out.Exec(t); 
} 

int main() { 
    Test2(5); 
    Test3(std::cout, 5); 
    return 0; 
} 

Comme il est écrit, gcc-4.4 donne les éléments suivants:

test.cpp: In function 'void Test1(Stream&, const Type&)':
test.cpp:22: error: expected primary-expression before 'bool'
test.cpp:22: error: expected ';' before 'bool'

Test2 et Test3 à la fois compilent proprement, et si je commente sur Test1 le programme exécute, et je reçois "1 5" comme je m'y attends Donc, il semble qu'il n'y a rien de mal à l'idée de ce que je veux faire, mais j'ai bâclé quelque chose dans la mise en œuvre.

Si quelqu'un pouvait faire la lumière sur ce que je néglige, il serait grandement apprécié.

Répondre

3

Vous devez dire au compilateur que le nom dépendant Printer<Stream>::Exec est un modèle:

out.template Exec<bool>(t); 

Ce principe est le même qu'avec typename, juste que dans ce cas le nom problématique est pas un type, mais un modèle .

+0

Merci beaucoup. Je ne me souviens pas d'avoir déjà rencontré cette syntaxe auparavant. –

Questions connexes