2010-08-05 32 views
2

Tenir compte de ce code:Typedefs et la spécialisation du modèle

typedef int type1; 
typedef int type2; 

template <typename> 
struct some_trait; 

template <> 
struct some_trait<type1> 
{ 
    static const int something=1; 
}; 

template <> 
struct some_trait<type2> 
{ 
    static const int something=2; 
}; 

Il échoue parce que ce que le compilateur voit est deux spécialisations de some_trait<int>.

Quel est le meilleur moyen de contourner ce problème?

+3

Comment attendez-vous une réponse à * quelle est la meilleure façon de contourner ce * lorsque vous? n'avez pas défini votre problème? C'est une erreur courante: poser une question sur une approche défaillante plutôt que de poser une question sur le problème réel. Qu'est-ce que vous voulez résoudre? Qu'est-ce qui vous a poussé à ajouter un caractère à 'type1' et' type2'? Pourquoi avez-vous besoin de deux 'int's pour être différent? - Le plus grand pas vers une réponse est de poser la bonne question. –

Répondre

3

Le meilleur moyen de contourner quoi exactement? Les deux noms de types se réfèrent au même type int. Comme il n'y a que un type ici, vous avez seulement besoin de un trait. Donc, "la meilleure façon de contourner le problème" serait d'enlever la deuxième spécialisation et de l'oublier. Terminé.

Est-ce ce que vous vouliez? Si non, veuillez fournir une description plus significative de ce que vous essayez d'accomplir.

+3

Je crois qu'il veut se spécialiser sur type1 & type2 qui est son abstraction sont des types sans rapport, mais le compilateur se bloque sur le détail de l'implémentation irrelevent qu'ils sont tous deux juste ints. –

6

Je pense pouvoir se spécialiser sur les noms type1 et type2 vous devrez les faire effectivement être différents types au lieu d'un alias pour le même type:

struct type1 { 
    int data; 
}; 

struct type2 { 
    int data; 
}; 

// ... 

Mais si vous expliquez plus sur votre but final, il pourrait y avoir une façon différente/meilleure d'accomplir ce que vous cherchez.

0

Je ne vois pas ce que vous essayez de faire ici. À la fin, les deux sont some_trait< int >.
Essayé de faire des structures autour d'un seul int?

2

vous pouvez avoir quelque chose comme ça si vous voulez dire spécialisation explicite:

enum TypeOne; 
enum TypeTwo; 

template <typename> 
class AClass; 

template <> 
class AClass<TypeOne>{ 
public: 
    int something; 
}; 

template <> 
class AClass<TypeTwo>{ 
public: 
    char something; 
}; 

AClass<TypeOne> obj1; 
AClass<TypeTwo> obj2; 

J'ai aussi vu quelque chose de bibliothèques Boost qui peut faire ce que vous voulez, typedef même type à différents types EXPLICIT spécialisation, mais je ne me souviens pas de ce que c'était exactement.

2

Cela ressemble à quelque chose comme ce qui suit peut-être ce que vous êtes après:

template <int arg> 
class AClass 
{ 
    static const int something=arg; 
}; 

qui serait instancié comme:

AClass<1> obj1; 
AClass<2> obj2; 
2

Ce code échoue parce que le compilateur voit même spécialisation survenue deux fois.

Votre problème est que typedef, malgré son nom, ne pas définir un nouveau type. Il génère uniquement un alias pour un autre type. En réalité, les noms type1 et type2 et int sont simplement des noms différents pour le même type.

Quelle est la meilleure façon de contourner cela dépend de ce que vous voulez réaliser.Si vous avez absolument besoin de cette spécialisation, vous devrez trouver deux types distincts. Cependant, il pourrait y avoir de meilleurs moyens de le faire.

0

Je pense que vous voulez réaliser quelque chose comme ceci: template <typename T, T t> struct typify{ static const T something = t;}; Vos 2 spécialisations écrirait alors que struct int_1 : typify<int, 1>{}; et ...