2009-09-30 8 views
0
Code

exemple est le suivant:en classe modèle

struct TEMP 
{ 
    int j; 
    TEMP() 
    { 
    j = 0; 
    } 
}; 

template<typename T> 
class classA 
{ 
    struct strA 
    { 
     long i; 
     strA():i(0) {} 
    }; 
    static strA obj_str; 
    classA(); 
}; 

template<typename T> 
classA<T>::classA() 
{} 

template<typename T> 
classA<TEMP>::strA classA<TEMP>::obj_str; 

int main() 
{ 
    return 0; 
} 

lors de la compilation de ce code, je reçois l'erreur suivante:

test1.cpp:32: internal compiler error: in import_export_decl, at cp/decl2.c:1970 Please submit a full bug report, with preprocessed source if appropriate. See http://bugzilla.redhat.com/bugzilla> for instructions. Preprocessed source stored into /tmp/ccUGE0GW.out file, please attach this to your bugreport.

Je construis ce code à la machine x86_64-redhat-linux , et la version gcc est gcc version 4.1.2 20070626 (Red Hat 4.1.2-14)

S'il vous plaît noter que ce code a déjà été construit avec gcc version 3.4.5 20051201 (Red Hat 3.4.5-2) à i386- Redhat-linux machine.

Aucune idée de la raison pour laquelle ce n'est pas possible avec gcc 4.1.2.

Merci d'avance.

+0

Avez-vous envoyé un rapport de bogue complet? C'est ce que l'erreur vous dit de faire. Vous pouvez essayer d'utiliser un autre compilateur [version] pour l'instant. – strager

+0

J'ai trouvé un rapport de bug ici: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24791 - cela ressemble à une variante de celui-là. –

+0

Une erreur de compilation interne signifie toujours que quelque chose ne va pas avec le compilateur, donc ne le prenez pas pour signifier que c'est de votre faute. –

Répondre

3

Dans tous les cas, votre code n'a pas beaucoup de sens dans la déclaration suivante.

template<typename T> 
classA<TEMP>::strA classA<TEMP>::obj_str; 

Parce que le paramètre T est utilisé nulle part dans la déclaration. Je pense que vous vouliez soit d'écrire l'une des choses suivantes:

// definition of static member of template 
template<typename T> 
typename classA<T>::strA classA<T>::obj_str; 

// ... or declaration of static member specialization for `T=TEMP` of template 
template<> 
classA<TEMP>::strA classA<TEMP>::obj_str; 

Je soupçonne que ce fut le premier. Pour le crash du compilateur - qui certainement ne devrait pas se produire dans tous les cas :)


Edit: Le bug a déjà été corrigé dans 4.4.1 au moins - je pense qu'il n'y a pas besoin de rapports plus.

+0

A droite, ce type de bug a été signalé et corrigé dans une version supérieure. Mais je pensais que s'il est possible de le construire avec la même version et avec un changement de code. Et oui, avec le changement de code ci-dessus, le code est compilé. Merci :) – Ruchi

0

Je suivrais le rapport d'erreur.

Questions connexes