Cette question fait suite à Moving a member function from base class to derived class breaks the program for no obvious reason (c'est un exemple typique de pourquoi on ne devrait pas utiliser using namespace std;
)
où les réponses ont suggéré de qualifier par this->
un nom de modèle dépendant (ce qui est en effet la méthode à suivre lorsqu'on fait référence à de tels membres dépendants). Cependant, il semble y avoir un problème, je vais donc fournir un exemple minimal reproduisant le problème.
Considérons le code :
#include
#include
using namespace std;
template
struct B
{
T bitset{};
};
template
struct D : B
{
bool foo()
{
return this->bitset < 32;
}
};
int main(){}
Le problème étrange est que même si this->bitset
devrait faire référence au membre B::bitset
, le compilateur est toujours confus et croit que nous essayons de faire référence à std::bitset
. L'erreur apparaît à la fois avec gcc6 et clang3.7. Des idées sur pourquoi cela se produit ? Cela fonctionne en le qualifiant avec B::bitset
cependant.
Erreur (verbatim) :
In member function 'bool D::foo(T, std::__cxx11::string)': cpp/scratch/minimal.cpp:24:22: error: invalid use of 'class std::bitset<1ul>'
MODIFICATION
Cela semble être un bug de parsing/lookup de nom pour moi. Si nous remplaçons <
par tout autre opérateur de comparaison (merci @Leon pour la remarque), par exemple
return this->bitset == 32;
le programme compile. Donc je suppose que dans this->bitset < 32
le parseur croit que nous essayons d'instancier un modèle (le signe <
), et nous avons oublié de fermer le >
. Mais je ne sais toujours pas si c'est un bug ou si c'est ainsi que le langage est censé fonctionner.