2013-08-15 2 views
0

J'ai une erreur'numeric_limits' est pas un modèle

limits:30:29: error: 'numeric_limits' is not a template 

dans le fichier, ce qui sature std :: numeric_limits pour un cours spécifique:

// file "limits" 
#include <limits> 

namespace std 
{ 
template<typename T> struct numeric_limits<XX::YY<T> > : public 
          numeric_limits<typename XX::YY<T>::ZZ> 
{ 
private: 
<...> 

ce qui peut être un problème?

Répondre

0
  1. Le nombre_limites n'essaie pas d'hériter de lui-même.

  2. Le fichier peut être nommé "limites", jusqu'à ce qu'il ne soit pas dans le chemin d'inclusion.

Le problème était que "limites" était dans le chemin d'inclusion. Donc, il a essayé de s'inclure, pas de limites std. Comme résultat aucune numeric_limits n'a été déclarée au début du fichier.

J'ai exclu le répertoire du chemin d'inclusion et tout fonctionne bien.

2

Votre fichier ne doit pas être nommé limits comme cela, car il empêche l'inclusion de l'en-tête système normal. Cela, et je ne suis même pas sûr qu'il soit légal de redéfinir les en-têtes.

Personnellement, je mettrais cette définition dans le même fichier d'en-tête que XX::YY

+0

Merci, cela m'a aidé. – klm123

3

Vous essayez de créer un std::numeric_limits qui hérite de std::numeric_limits - mais au moment où vous arrivez à la partie public numeric_limits..., vous avez déjà déclaré votre propre modèle (qui est encore incomplet) qui est déjà nommé numeric_limits, donc il essaie d'hériter de lui-même au lieu de l'existant std::numeric_limits.

std::numeric_limits n'est pas conçue comme une classe de base, et ne fournit aucune fonction virtuelle, donc l'héritage n'est pas utile de toute façon. Pour numeric_limits gérer votre classe particulière correctement, vous souhaitez définir une spécialisation de numeric_limits pour ce type:

#include <limits> // get base template definition + standard specializations 

namespace std { 

template<>  // define your specialization 
class numeric_limits<MyType> { 
// ... 
}; 

} 

Notez que c'est l'un des seuls cas où vous êtes autorisé à ajouter quelque chose à l'espace de noms std - - ajouter une nouvelle spécialisation d'un modèle existant sur un type défini par l'utilisateur.

+0

numeric_limits est un de type 'struct' pas' class'. Il étend 'public __numeric_limits_base' qui est aussi un' struct' –

+2

@TheOtherGuy - n'a pas d'importance s'il est étiqueté 'struct' ou' class'; que ** seulement ** affecte l'accès par défaut. En fait, vous pouvez déclarer 'struct X;' et le définir comme 'class X {...};' et vice versa. Le reste de votre commentaire semble être des détails internes pour une implémentation particulière. –

+0

@PeteBecker Je savais que 'structs' avait ses membres mis à' public' par défaut. Je ne savais pas que vous pouviez déclarer 'struct' et le définir comme' class', je ne m'attendais pas à ce qu'il soit autorisé! Merci! –

Questions connexes