我们正在为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'
你能解释一下这个错误吗?什么是交叉编译器解决方案?
非常感谢!
答案 0 :(得分:9)
问题在于,由于C ++编译器不知道T
的实际类型(更不用说T::NodeVector
,因此它不知道magnitude
应该是模板。您需要明确指定:
x.template magnitude<double>();
否则C ++会将令牌解析为x
,operator.
,magnitude
,operator<
,double
,operator>
......
答案 1 :(得分:1)
在B点,它无法知道x是什么类型,并且该量值将是模板函数,因此您需要首先将其声明为。