Précédent   Forum du club des développeurs et IT Pro > C et C++ > C++ > Langage
Langage Langage C++, Programmation Orientée Objet, Templates, etc. Avant de poster : FAQ C++
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 24/12/2012, 16h11   #1
victor_gasgas
Membre du Club
 
Inscription : avril 2009
Messages : 186
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 186
Points : 64
Points : 64
Par défaut Colle sur l'utilisation délirante du mot clé template

Au delà du titre , voici un code où j'aurais bien besoin d'aide : la ligne 40, qui contient un appel de fonction nécessite le mot clé template? en effet elle ne compile pas sinon (gcc 4.7)!!

Je n'avais jamais vu ça avant, et c'est le seul moyen pour que le code compile.
Existe-t-il un moyen de se séparer, et à quoi sert-il exactement pour cet appel de fonction?

Le code est purement pour illustrer le problème.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <memory>
 
struct opengl {};
 
struct opengl_window {};
 
 
template<typename api_type>
struct renderer;
 
template<>
struct renderer<opengl>
{
    typedef opengl_window render_window_type;
 
    template<typename T, typename... Args>
    std::shared_ptr<T> make(Args&&... args)
    {
        return std::make_shared<T>( std::forward<Args>(args)... );
    }
};
 
 
 
template<typename api_type>
struct app
{
    typedef renderer<api_type> renderer_api_type;
 
    typedef typename renderer_api_type::render_window_type    render_window_api_type;
 
 
    std::shared_ptr<renderer_api_type> m_renderer;
    std::shared_ptr<render_window_api_type> m_window;
 
    void test()
    {
        m_renderer = std::make_shared<renderer_api_type>();
 
        m_window = m_renderer->template make<render_window_api_type>();
        //m_window = m_renderer->make<render_window_api_type>();
    }
};
 
 
 
 
int main()
{
    app<opengl> a;
    a.test();
 
    return 0;
}
Merci d'avance!

Bonne fêtes à tous et à toutes!
victor_gasgas est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/12/2012, 17h26   #2
Flob90
Modérateur
 
Avatar de Flob90
 
Homme Florian Blanchet
Etudiant en Optique
Inscription : août 2004
Messages : 1 060
Détails du profil
Informations personnelles :
Nom : Homme Florian Blanchet
Âge : 22
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Etudiant en Optique

Informations forums :
Inscription : août 2004
Messages : 1 060
Points : 2 492
Points : 2 492
Quand tu as un objet d'un type dépendant d'un paramètre template, si tu appels une fonction membre template sur cet objet, il faut indiquer au compilateur que cette fonction est template grâce à ce mot-clé. C'est une logique comparable à celle de typename.

FaQ Comeau (en google cache) section 13 :
http://webcache.googleusercontent.co...&ct=clnk&gl=fr
__________________
"We can solve any problem by introducing an extra level of indirection" Butler Lampson

"N'importe quel problème peut être résolu en introduisant un niveau d'indirection supplémentaire" Butler Lampson (traduction libre)
Flob90 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 24/12/2012, 17h59   #3
victor_gasgas
Membre du Club
 
Inscription : avril 2009
Messages : 186
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 186
Points : 64
Points : 64
Thanks!
victor_gasgas est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 19h55.


 
 
 
 
Partenaires

Hébergement Web