tags:

views:

288

answers:

3

I have the following template declaration:

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;

Which throws the illegal token error as noted, on the line with "-(std::numeric_limits::max())". I got this code from some old linux source that I'm trying to compile on Windows. Any idea what the issue is?

Edit: It also fails using min(), and the compiler output is:

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

Line 216, is the line previously mentioned.

+10  A: 

My guess is that max has been made a macro. This happens at some point inside windows.h.

Define NOMINMAX prior to including to stop windows.h from doing that.

EDIT:

I'm still confident this is your problem. (Not including <limits> would result in a different error). Place #undef max and #undef min just before the function and try again. If that fixes it, I was correct, and your NOMINMAX isn't being defined properly. (Add it as a project setting.)

You can also prevent macro expansion by: (std::numeric_limits<T>::max)().


On a side note, why not do std::numeric_limits<T>::min() instead of negating the max?

GMan
haha... very good point. Didn't write it though, and honestly haven't tried to understand it, just port it. But, yeah, that would make total sense.
Adam Haile
NOMINMAX didn't work either
Adam Haile
and max() resolves to the definition in limits
Adam Haile
@Adam: ...Except if T is a float or a double - then you'll want to make sure numeric_limits::min() is relevant.
RaphaelSP
Obviously, my comment applies to your first one :-)
RaphaelSP
Or, if you can't use `NOMINMAX` for some reason, you can prevent the macro expansion by parenthesizing the function name: `(std::numeric_limits<T>::max)()`. This is very, very ugly, but can be necessary in some cases.
James McNellis
@James: Stop eating unicorns. Additionally, I forgot about that trick and will add it.
GMan
For twos-complement integers (which are pretty much all you get anymore), the minimum is one less than the negation of the maximum. So, I agree with your side note: why negate the max?
David Thornley
@GMan: I would stop eating unicorns. I really would. But did you know that you can only change your display name once every 30 days? I obviously did not know this. /facepalm!
James McNellis
@Unicorns: Haha, I knew that but I totally forgot! Looks like we'll be unicorn themed for a while. At least I put my normal name in it. :P
GMan
@James: Haha. I think I've grown fond of my unicorn. I shall keep him :3 His name is Max.
GMan
+1  A: 

Looks like you need to:

#include <limits>

John Dibling
A: 

I wrote a "test harness" with a trivial struct containing your method declaration (and nothing else), and #included <limits> and <vector>, and invoked (and thus instantiated) the method with T being int, and it compiled just fine, both on Visual Studio 2008 Express on Windows Vista and with GCC 4.2.4 on Linux 2.6.

I suggest trying to build only a minimal amount of code with the "problem" in it, and if that actually does build, add back in the rest of your project until it breaks, then you'll know what caused it.

John Zwinck