2010-08-23 2 views
0

GCC a un format très bavard pour certains messages d'erreur de modèle:Format d'erreur de modèle différent dans GCC?

... some_class<A,B,C> [with int A = 1, int B = 2, int C = 3] 

Toute chance de le faire montrer quelque chose comme:

... some_class<1,2,3> 
+0

non seulement gcc ... –

Répondre

3

Vous perdrez piste à partir que soit le modèle de la spécialisation provient de:

template<int A, int B> class X { 
    void f(); 
}; 

template<int A> class X<A, 2> { 
    void f(); 
}; 

int main() { 
    X<1, 2>().f(); 
    X<2, 1>().f(); 
} 

sorties GCC

m.cpp: In function 'int main()': 
m.cpp:6:12: error: 'void X<A, 2>::f() [with int A = 1]' is private 
m.cpp:10:19: error: within this context 
m.cpp:2:12: error: 'void X<A, B>::f() [with int A = 2, int B = 1]' is private 
m.cpp:11:19: error: within this context 

Si elle a juste dit X<1, 2> et X<2, 1> vous perdriez une information importante que ce diagnostic contient.

+0

L'ancien format est plus informatif sans aucun doute à ce sujet, je ne voulais pas dire que c'est généralement mauvais. Pourtant, il peut rapidement devenir illisible. Btw, il aurait pu montrer quelque chose comme: 'X <1,(2)>' & 'X <2,1>' pour marquer quels arguments viennent de la spécialisation explicite. – uj2

1

Non, à moins que vous êtes prêt à maintenir une branche privée de GCC la source.

Bien qu'il soit raisonnable de le vouloir pour les modèles de classe, les modèles de fonction peuvent être surchargés les uns par rapport aux autres et avoir différentes listes d'arguments de modèle pour la même fonction. Alors le dernier style d'erreur serait ambigu.

1

Utilisez l'option -fno-pretty-templates. Cela fait ce que vous voulez, et omet également les arguments de modèle par défaut.

+0

C'est tout le contraire; à partir du manuel: Lorsqu'un message d'erreur fait référence à une spécialisation d'un modèle de classe, le compilateur omet tous les arguments de modèle qui correspondent aux arguments de modèle par défaut pour ce modèle. Si l'un de ces comportements rend plus difficile la compréhension du message d'erreur plutôt que sa facilité, vous pouvez utiliser -fno-pretty-templates pour le désactiver. – hannes

+0

S'il vous plaît essayer de compiler ce programme simple avec et sans l'option. main() {vecteur v; v.pop_back(); } L'option -fno-pretty-templates supprime [avec T = int], etc. des messages d'erreur. – Sameer

Questions connexes