Bonjour,
les templates en c++ ne cessent de me plonger dans des abîmes de perplexité.
Prenons par exemple le code suivant, séparé en 2 fichiers, le main.cpp et un header foo.h :
Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 /* ----- foo.h ----- */ template <typename T> class Foo { private: Bar m_bar; }; /* ----- main.cpp ----- */ #include "Foo.h" int main() { return 0; }
Je compile avec VS 2017, en Release full opti (/O2).
Et j'obtiens l'erreur suivante:
J'ai mis en gras ce qui me pose problème ici : il ne parviens pas à compiler parce qu'il ne connais pas le type Bar. C'est évident puisque je ne lui "dit" jamais ce qu'est ce type, ni même qu'il existe.1> error C3646: 'm_bar': unknown override specifier
1> note: see reference to class template instantiation 'Foo<T>' being compiled
Mais Foo est une classe template, que je n'utilise nulle part. Il me semblait que si on instanciait jamais une classe template, alors la classe n'était jamais compilée.
Du moins c'est ainsi que j'avais compris comment fonctionnait la compilation de classes template: à chaque fois qu'on va créer une instance où le type template est différent, le compilateur va créer une nouvelle version de cette classe. Donc si on ne l'instancie pas, elle n'est pas compilée.
J'ai passé pas mal de temps à chercher des infos là-dessus, mais je ne trouve rien qui explique ça clairement. Auriez-vous des explication ou des références à me proposer ?
Partager