我们正在为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 解析为xoperator.magnitudeoperator<doubleoperator>

顺便说一句,海湾合作委员会是正确的。众所周知,MSVC++在此类问题上松懈。

10-04 10:01