2010-09-14 10 views
0

J'utilise une classe "événement" C++ qui permet d'appeler un ou deux arguments dans les délégués.Spécialisation partielle et spécialisation complète requise <> après la définition de type

Dernièrement, j'ai ajouté le support pour les délégués qui ne nécessitent pas des arguments, mais quand je specialze la classe à utiliser aucun argument de modèle, je suis toujours nécessaire d'ajouter <> afther la définition de classe.

Exemple d'utilisation avec un/deux arguments:

class Example 
{ 
public: 
    event<int> SingleArgEvent; 
    event<int, int> DoubleArgEvent; 
}; 

Et ici le pas d'exemple l'argument:

class Example 
{ 
public: 
    event<> NoArgTest1; // compiles just fine 
    event NoArgTest2; // gives me C2955: 'event' : use of class template requires template argument list 
}; 

Comme il fonctionne avec les parenthèses, je ne vois pas une raison pour laquelle ils devraient être là. est ici le code de spécialisation de classe:

class null_typelist {}; 
/** event template **/ 
template <class Targ1 = null_typelist, class Targ2 = null_typelist> 
class event : public event2_base<Targ1, Targ2> 
{ 
}; 

template <class Targ> 
class event<Targ, null_typelist> : public event1_base<Targ> 
{ 
}; 

template <> 
class event<null_typelist, null_typelist> : public event0_base 
{ 
}; 

Répondre

3

Si vous voulez appeler une fonction foo sans argument, vous devez écrire foo() pas seulement foo. C'est exactement la même chose pour les types de modèles. event n'est pas un type, c'est une "fonction" qui prend des types et retourne un type. Si vous voulez vraiment éviter d'écrire les supports, vous pouvez encore faire quelque chose comme:

typedef event<> event_; 
+0

L'idée était d'avoir le même nom de classe "événement", peu importe la quantité d'arguments de modèle. Avec un typedef qui s'en va. Je suppose qu'il n'y a pas de solution de contournement? – Stormenet

3

Les crochets sont nécessaires parce que la grammaire du C dit.

Dans 14.2/1 (temp.names/1), < et> ne sont pas facultatifs, tandis que template-argument-list l'est. Donc, l'événement <> est un ID de modèle valide alors que l'événement n'est pas dû à l'absence de <>.

template-id: 
      template-name < template-argument-list opt >