19
votes

Here's yet another VC9 vs. GCC 4.2 compile error problem. The following code compiles fine with VC9 (Microsoft Visual C++ 2008 SP1) but not with GCC 4.2 on Mac:

struct C
{
    template< typename T >
    static bool big() { return sizeof( T ) > 8; }
};

template< typename X >
struct UseBig
{
    static bool test()
    {
        return X::big< char >(); // ERROR: expected primary-expression
    }                            // before 'char'
};

int main()
{
    C::big< char >();
    UseBig< C >::test();
    return 0;
}

Any ideas how I can fix this?

1
This comes up every so often because it's hard to search for it. For the record, GCC used to compile this when Visual Studio did not. GCC removed this behavior because it caused a lot of head scratching and was not standards compliant.Max Lybbert

1 Answers

43
votes

That should be

return X::template big< char >();

Dependent names from templates are taken to not be types unless you specify that they are via typename and assumed to not be templates unless specified via template.