web-dev-qa-db-fra.com

Jeton illégal sur le côté droit de ::

J'ai le modèle de déclaration suivant:

template <typename T>
   void IterTable(int&                       rIdx,
                  std::vector<double>&       rVarVector,
                  const std::vector<T>&      aTable,
                  const T                    aValue,
                  T              aLowerBound = -(std::numeric_limits<T>::max()), //illegal token on right side of '::' shows here
                  bool                       aLeftOpen = true) const;

Ce qui jette l'erreur de jeton illégale comme indiqué, sur la ligne avec "std :: numeric_limits :: max ())". J'ai obtenu ce code d'une ancienne source Linux que j'essaie de compiler sous Windows. Une idée du problème?

--- (Edit: Il échoue également en utilisant min (), et la sortie du compilateur est:

Error   92  error C2589: '::' : illegal token on right side of '::' c:\projects\r&d\prepaydll\include\cfcdefault.h  216 PrepayDLL

Error   93  error C2059: syntax error : '::'    c:\projects\r&d\prepaydll\include\cfcdefault.h  216 PrepayDLL

La ligne 216 est la ligne mentionnée précédemment.

48
Adam Haile

Je suppose que max a été transformé en macro. Cela se produit à un moment donné à l'intérieur de windows.h.

Définissez NOMINMAX avant d'inclure pour empêcher windows.h De le faire.

ÉDITER:

Je suis toujours convaincu que c'est votre problème. (Ne pas inclure <limits> Entraînerait une erreur différente). Placez #undef max Et #undef min Juste avant la fonction et réessayez. Si cela le corrige, j'avais raison et votre NOMINMAX n'est pas défini correctement. (Ajoutez-le comme paramètre de projet.)

Vous pouvez également empêcher l'expansion des macros en: (std::numeric_limits<T>::max)().


D'un autre côté, pourquoi ne pas faire std::numeric_limits<T>::min() au lieu de nier le max?

112
GManNickG

On dirait que vous devez:

#include <limits>

1
John Dibling

J'ai écrit un "harnais de test" avec une structure triviale contenant votre déclaration de méthode (et rien d'autre), et #included <limits> et <vector>, et a invoqué (et donc instancié) la méthode avec T étant int, et elle s'est très bien compilée, à la fois sur Visual Studio 2008 Express sur Windows Vista et avec GCC 4.2.4 sur Linux 2.6.

Je suggère d'essayer de construire seulement une quantité minimale de code avec le "problème", et si cela se construit, ajoutez-le dans le reste de votre projet jusqu'à ce qu'il se brise, alors vous saurez ce qui l'a causé.

0
John Zwinck