2

J'utilise PC-Lint (outil d'analyse de code statique - voir http://www.gimpel.com/) Pour le morceau de code suivant:erreur avec une spécialisation partielle C de du modèle

class ASD { 
    protected: 
     template<int N> 
     void foo(); 
}; 

template<> 
inline void ASD::foo<1>() {} 

template<int N> 
inline void ASD::foo() {} 

PC-lint me donne un avertissement:

inline void ASD::foo<1>() {} 
mysqldatabaseupdate.h(7) : Error 1060: protected member 'ASD::foo(void)' is not accessible to non-member non-friend functions 

Je crois que le code est bien et l'erreur est du côté de la fibre, mais je pense que l'outil de Lint est vraiment excellent outil et il est plus probable que je ne sais pas quelque chose. Alors, est-ce que ce code est OK?

Répondre

1

Le bug était dans PC-Lint lui-même. Il a été corrigé dans la dernière version.

2

Vous avez une seule fonctionfoo dans votre struct ASD et il est dans la section protected. Il n'est pas accessible depuis les fonctions non membres. En même temps struct ASD n'a pas d'autres fonctions membres. Donc, personne n'a accès à foo, je crois que c'est la raison de ce message d'erreur.

Essayez de changer votre struct à ce qui suit, par exemple:

class ASD { 
    public: 
     void bar() { foo<1>(); } 
    protected: 
     template<int N> 
     void foo(); 
}; 
+1

Mais aucune classe enfant arbitraire n'a-t-elle accès à la fonction 'foo'? –

+0

Dans cet exemple, et je crois au code qui produit l'erreur, il n'y a pas de classes enfants. –

+0

Essayez d'ajouter une fonction virtuelle à la classe. Cela peut faire un compromis ici. –