2010-10-22 8 views
6

Je me demande quelle est la syntaxe pour appeler la méthode de modèle donné comme:Syntaxe pour appeler la méthode basé sur un modèle

struct print_ch { 
    print_ch(char const& ch) : m_ch(ch) { } 
    ~print_ch() { } 
    template<typename T> 
    void operator()() { 
     std::cout << static_cast<T>(m_ch) << std::endl; 
    } 
    private: 
    char m_ch; 
}; 

je suis venu avec STH comme ceci:

print_ch printer('c'); 
printer.operator()<int>(); 

Et il semble fonctionner (4,5 GCC), mais lors de l'utilisation à l'intérieur d'un autre procédé basé sur un modèle, par exemple:

struct printer { 

    typedef int print_type; 

    template<typename T_functor> 
    static void print(T_functor& fnct) { 
     fnct.operator()<print_type>(); 
    } 

}; 

Compilation échoue avec error: expected primary-expression before '>' token. Une idée pour bien faire les choses? Merci d'avance.

+4

Il est beaucoup plus propre il suffit de créer une fonction régulière. Les opérateurs doivent être utilisés avec parcimonie et lorsque cela est approprié. – JoshD

+0

@JoshD merci, vous avez raison, je vais devoir reconsidérer cela – erjot

+0

En effet, surcharger 'operator()' n'a pas de sens ici, car il ne peut pas être appelé avec la même syntaxe qu'une fonction normale, ce qui défait complètement le but. – UncleBens

Répondre

8

Vous devez dire au compilateur explicitement que le operator() du fnct lui-même est basé sur un modèle un modèle:

fnct.template operator()<print_type>(); 

Si vous ne spécifiez pas avec le mot-clé template le compilateur suppose que operator() est juste méthode normale, pas un modèle.

+0

exactement cela, maintenant il semble si évident - merci! – erjot

2

Depuis T_functor lui-même est un modèle, le compilateur (ou analyseur) suppose de ne rien savoir au sujet de ses membres, de sorte que vous devez dire explicetly ce que vous appelez un Methode de modèle à l'aide:

 fnct.template operator()<print_type>(); 
Questions connexes