2010-11-27 7 views
1

Pourquoi ne puis-je faire cela:Ne pas avoir accès au modèle de modèle paramètres

template<template<class E>class Derived> 
struct X 
{ 
    static void f() 
    { 
     Derived<E>::value; 
    } 
}; 

Le problème que j'ai est que je ne peux pas compiler ce code pour la raison que je reçois une erreur disant ce param E n'a pas été déclaré. Y at-il un moyen que je peux utiliser ce paramètre formel ou non?

Répondre

3

Les paramètres des paramètres de modèle de modèle n'obtiennent pas d'arguments et n'ont donc généralement pas de noms. La spécialisation partielle est l'exception à cette règle. Essayez ceci:

template<class> // Derived<E> is only only parameter 
struct X; // but you actually need two parameters, Derived and E 

template< template <class> class Derived, class E > 
struct X< Derived<E> > // so use partial specialization. 
{ 
    static void f() 
    { 
     Derived<E>::value; // only reason to want this is to 
     Derived<int>::value; // use different specializations 
    } 
}; 

Bien sûr, si vous n'avez pas besoin de re-spécialiser sur Derived<something_else>, ignorer le fait que Derived<E> est une spécialisation de modèle:

template<class Derived> 
struct X 
{ 
    static void f() 
    { 
     Derived::value; 
    } 
}; 

X< my_class<something> > my_x; // a specialized class template is a class 
2

Votre paramètre de modèle Derived est un modèle lui-même, E est son paramètre formel. Vous devez également lui donner une valeur.

Peut-être que vous avez besoin:

template<template<class E>class Derived, class T> 
struct X 
{ 
    static void f() 
    { 
     Derived<T>::value; 
    } 
}; 
+0

maintenant 'e' est utilisé ... – Potatoswatter

+0

@Potatoswatter: en effet, on peut simplement écrire 'template