2017-01-27 1 views
0

J'ai une classe de modèlemodèle Extern: déclaration ne déclare rien

expof.h:

template <class T> 
class ExpOf{ 
... 
} 

que je l'utilise à plusieurs reprises dans mon code pour exemple T = double [et d'autres classes que ExpOf ne devrait pas savoir quelque chose sur]. donc je pensais que ce serait une bonne idée de compiler une fois pour toutes [ou deux fois ...]

expofdouble.cpp:

#include "expof.h" 
template class ExpOf<double>; 

et le déclarer dans un en-tête donc il ne serait pas être compilé quand expof.h est inclus.

expofdouble.h:

extern template ExpOf<double>; 

Quand je compile ce (clang-800.0.42.1) que je reçois (nombreux) avertissements

expofdouble.h: warning: declaration does not declare anything [-Wmissing-declarations] 
extern template ExpOf<double>; 
       ^~~~~~~~~~~~~ 

Suis-je obtenir le comportement souhaité? Pourquoi l'avertissement alors? Dois-je le faire différemment?

Répondre

0

expofdouble.h doit contenir cette ligne:

extern template class ExpOf<double>; 

Votre déclaration omet le mot-clé class, il ne déclare pas vraiment quoi que ce soit.

(Notez que vous obtiendrez le même avertissement avec une déclaration comme extern int;, ce qui ne fait pas tout à fait évidemment quelque chose d'utile pour vous.)

+0

Merci, c'était simple et facile après votre commentaire. Je reçois cependant une erreur de temps de liaison dépendant du compilateur, car 'template class' n'instancie pas un constructeur de déplacement explicitement par défaut ... Cela semble être un bug connu de certains compilateurs, [voir ici] (http://stackoverflow.com/questions/38929950/automatic-constructor-in-explicitly-instantiated-class-template) au cas où cela aiderait quelqu'un. – Lio