我们正在为Visual Studio 2008编写一些代码,并尝试使用gcc进行编译。我们在以下代码中遇到了错误(简化为必要代码):
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>(); //< error here
}
};
...
B<A> test;
test.foo();
海湾合作委员会说
error: expected primary-expression before 'double'
error: expected `;' before 'double'
你能向我解释这个错误吗?什么是交叉编译器解决方案?
非常感谢!
最佳答案
问题在于,由于C++编译器不知道T
的实际类型(更不用说T::NodeVector
了,所以不知道magnitude
应该是模板。您需要明确指定:
x.template magnitude<double>();
否则,C++会将 token 解析为
x
,operator.
,magnitude
,operator<
,double
,operator>
…顺便说一句,海湾合作委员会是正确的。众所周知,MSVC++在此类问题上松懈。