2012-08-29 3 views
0

Im ayant un problème avec un typedef ci-dessous, je peux sembler l'obtenir droite:typedef d'un modèle avec un type de modèle comme paramètre

template <typename T> 
    struct myclass1 { 
    static const int member1 = T::GetSomeInt(); 
}; 

template <int I> 
struct myclass2 { 
    typedef myclass1< myclass2<I> > anotherclass; 
    static int GetSomeInt(); 
}; 

anotherclass MyObj1; // ERROR here not instantiating the class 

Lorsque je tente et initialiser un objet anotherclass, il me donne une erreur.

Toute idée de ce que je fais mal? Il semble y avoir un problème avec mon typedef.

Toute aide est appréciée, Merci Bryan

+0

Quelle erreur obtenez-vous? –

+0

Voulez-vous le modèle ou ? – Grzegorz

+0

Je suis désolé, j'ai édité ma réponse et expliqué mieux. –

Répondre

3

Vous faites référence anotherclass directement. Ce nom n'existe pas à cette portée. Vous devez déclarer votre variable

myclass2<some_int>::anotherclass MyObj1; 

some_int est tout entier la valeur que vous voulez avec myclass2 paramétrez.

Je pense que vous devrez également marquer myclass2<I>::GetSomeInt() comme étant constexpr afin qu'il puisse être utilisé dans l'initialiseur de myclass1<T>::member1.

Avec ces réglages, le code suivant compile très bien:

#include <iostream> 

template<typename T> 
struct myclass1 { 
    static const int member1 = T::GetSomeInt(); 
}; 

template<int I> 
struct myclass2 { 
    typedef myclass1<myclass2<I>> anotherclass; 
    constexpr static int GetSomeInt() { return I; }; 
}; 

int main(int argc, char *argv[]) { 
    myclass2<3>::anotherclass obj; 
    std::cout << obj.member1 << std::endl; 
} 

Remarque, cela nécessite 11 C++ pour constexpr. Si vous voulez C++ 03 alors je ne pense pas que votre myclass1<T>::member1 est légal.

0

Vous créez un typedef en utilisant myclass1 et en passant dans une classe modélisée comme paramètre. Par conséquent, vous devez utiliser les paramètres du modèle de modèle. Cela signifie que la déclaration de myclass1 doit être modifiée pour indiquer au compilateur que T dans template <typename T> est lui-même une classe modèle.

Voir si la modification du code ci-dessous

template <typename T> 
    struct myclass1 { 
    static const int member1 = T::GetSomeInt(); 
}; 

à ce résout le problème:

template < template <typename BasicType> class T> 
    struct myclass1 { 
    static const int member1 = T::GetSomeInt(); 
}; 
+0

Avec les tweaks mentionnés dans ma réponse, le code compile bien. Vous n'avez pas besoin d'un paramètre de modèle de modèle. –

+0

Merci pour la confirmation. Je pensais qu'il aurait dû être compilé tel quel, sauf si un argument par défaut est spécifié. – vvnraman

Questions connexes