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.
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.
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?
On dirait que vous devez:
#include <limits>
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é.