we're taking some code written for Visual Studio 2008 and try to compile it with gcc. We experienced an error in the following code (simplified to what's necessary):
template<int R, int C, typename T>
struct Vector
{
template <typename TRes>
TRes magnitude() const
{
return 0;
}
};
struct A
{
typedef Vector<3,1,int> NodeVector;
};
template<class T>
struct B
{
void foo()
{
typename T::NodeVector x;
x.magnitude<double>()开发者_JAVA百科; //< error here
}
};
...
B<A> test;
test.foo();
GCC says
error: expected primary-expression before 'double'
error: expected `;' before 'double'
Can you explain the error to me? What's a cross-compiler solution?
Thanks a lot!
The problem is that since the C++ compiler doesn’t know the actual type of T
(let alone T::NodeVector
it doesn’t know that magnitude
is supposed to be a template. You need to specify that explicitly:
x.template magnitude<double>();
Otherwise C++ will parse the tokens as x
, operator.
, magnitude
, operator<
, double
, operator>
…
The GCC is right, by the way. MSVC++ is notoriously lax on such matters.
At the point of B it has no way to know what type x is, and that magnitude will be a template function so you need to declare it as one first.
精彩评论