Hello
Quelques éléments en complément de la réponse de JolyLoïc. Pour que l'exercice soit pertinent, il faut déjà supprimer cette spécialisation:
template <> class Base<float> {};
Ensuite, GCC et Clang sortent bien en erreur dans ce cas, et pour fois, c'est le message d'erreur de GCC qui est le plus clair !

Envoyé par
GCC
main.cpp: In member function 'void Derived<T>::doDerivedWork()':
main.cpp:11:18: error: there are no arguments to 'doBaseWork' that depend on a template parameter, so a declaration of 'doBaseWork' must be available [-fpermissive]
main.cpp:11:18: note: (if you use '-fpermissive', G++ will accept your code, but allowing the use of an undeclared name is deprecated)

Envoyé par
Clang
main.cpp:11:7: error: use of undeclared identifier 'doBaseWork'
doBaseWork();
^
A noter qu'on peut réussir la compilation avec cette syntaxe:
Mais à déconseiller car cela référence explicitement la classe de base, ce que l'usage de this permet d'éviter.
Pour ma part, je n'avais jamais rencontré cette erreur avant !
Partager