Ошибка GCC при компиляции кода MS VC ++ с шаблонами - PullRequest
1 голос
/ 11 февраля 2011

мы берем код, написанный для 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();

GCC говорит

error: expected primary-expression before 'double'
error: expected `;' before 'double'

Можете ли вы объяснить эту ошибку мне?Что такое кросс-компиляторное решение?

Большое спасибо!

Ответы [ 2 ]

9 голосов
/ 11 февраля 2011

Проблема в том, что поскольку компилятор C ++ не знает фактический тип T (не говоря уже о T::NodeVector, он не знает, что magnitude должен быть шаблоном. Вам необходимо указать это явно :

x.template magnitude<double>();

В противном случае C ++ будет анализировать токены как x, operator., magnitude, operator<, double, operator>

Кстати, GCC прав. MSVC ++ небезызвестен в таких вопросах.

1 голос
/ 11 февраля 2011

В точке B нет никакого способа узнать, что такое тип x, и эта величина будет функцией шаблона, поэтому вам нужно сначала объявить ее как единицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...