2015-12-11 4 views
1

Ниже приведен класс, который я пытаюсь скомпилировать с помощью Visual Studio 2013. Код был первоначально написан в Visual Studio 2005. Его значение project from github. Очевидно, что код будет компилироваться в Visual Studio 2005, но дает синтаксические ошибки в Visual Studio 2013. Изменились ли языковые спецификации? Или это проблема обратной совместимости?Я не понимаю ошибку, показанную компилятором VS2013

template<class Real = double> 
class Quaternion //normalized quaternion for representing rotations 
{ 
public: 
    //constructors 
    Quaternion() : r(1.) { } //initialize to identity 
    Quaternion(const Quaternion &q) : r(q.r), v(q.v) {} //copy constructor 
    template<class R> Quaternion(const Quaternion<R> &q) : r(q.r), v(q.v) {} //convert quaternions of other types 
    //axis angle constructor: 
    template<class R> Quaternion(const Vector<R, 3> &axis, const R &angle) : r(cos(angle * Real(0.5))), v(sin(angle * Real(0.5)) * axis.normalize()) {} 
    //minimum rotation constructor: 
    template<class R> Quaternion(const Vector<R, 3> &from, const Vector<R, 3> &to) : r(1.) 
    { 
     R fromLenSq = from.lengthsq(), toLenSq = to.lengthsq(); 
     if(fromLenSq < toLenSq) { 
      if(fromLenSq < R(1e-16)) 
       return; 
      Vector<R, 3> mid = from * sqrt(toLenSq/fromLenSq) + to; 
      R fac = 1./sqrt(mid.lengthsq() * toLenSq); 
      r = (mid * to) * fac; 
      v = (mid % to) * fac; 
     } 
     else { 
      if(toLenSq < R(1e-16)) 
       return; 
      Vector<R, 3> mid = from + to * sqrt(fromLenSq/toLenSq); 
      R fac = 1./sqrt(mid.lengthsq() * fromLenSq); 
      r = (from * mid) * fac; 
      v = (from % mid) * fac; 
     } 
    } 

    //quaternion multiplication 
    Quaternion operator*(const Quaternion &q) const { return Quaternion(r * q.r - v * q.v, r * q.v + q.r * v + v % q.v); } 

    //transforming a vector 
    Vector<Real, 3> operator*(const Vector<Real, 3> &p) const 
    { 
     Vector<Real, 3> v2 = v + v; 
     Vector<Real, 3> vsq2 = v.apply(multiplies<Real>(), v2); 
     Vector<Real, 3> rv2 = r * v2; 
     Vector<Real, 3> vv2(v[1] * v2[2], v[0] * v2[2], v[0] * v2[1]); 
     return Vector<Real, 3>(p[0] * (Real(1.) - vsq2[1] - vsq2[2]) + p[1] * (vv2[2] - rv2[2]) + p[2] * (vv2[1] + rv2[1]), 
           p[1] * (Real(1.) - vsq2[2] - vsq2[0]) + p[2] * (vv2[0] - rv2[0]) + p[0] * (vv2[2] + rv2[2]), 
           p[2] * (Real(1.) - vsq2[0] - vsq2[1]) + p[0] * (vv2[1] - rv2[1]) + p[1] * (vv2[0] + rv2[0])); 
    } 

    //equality 
    template<class R> bool operator==(const Quaternion<R> &oth) const 
    { 
     return (r == oth.r && v == oth.v) || (r == -oth.r && v == -oth.v); 
    } 

    Quaternion inverse() const { return Quaternion(-r, v); } 

    Real getAngle() const { return Real(2.) * atan2(v.length(), r); } 
    Vector<Real, 3> getAxis() const { return v.normalize(); } 

    const Real &operator[](int i) const { return (i == 0) ? r : v[i - 1]; } 
    void set(const Real &inR, const Vector<Real, 3> &inV) { 
     Real ratio = Real(1.)/sqrt(inR * inR + inV.lengthsq()); 
     r = inR * ratio; v = inV * ratio; //normalize 
    } 

private: 
    Quaternion(const Real &inR, const Vector<Real, 3> &inV) : r(inR), v(inV) {} 

    Real r; 
    Vector<Real, 3> v; 
}; 

И показали ошибки являются:

Error 1 error C2989: 'Quaternion' : class template has already been declared as a non-class template c:\users\student\documents\visual studio 2013\projects\narovatar\imp_pinocchio\transform.h 93 1 Rigging 

Error 3 error C3857: 'Quaternion': multiple template parameter lists are not allowed c:\users\student\documents\visual studio 2013\projects\narovatar\imp_pinocchio\transform.h 24 1 Rigging 

Может кто-нибудь сказать мне, что значит ошибка ???

+0

Ищите охоту в своем проекте для форвардных определений 'Quaternion', где вы не указали его как шаблонный. – user4581301

+0

Большое спасибо ... Я понял ... У меня был другой проект, связанный с еще одним определением Quaternion ... – Nickal

ответ

0

Это означает, что уже есть класс без шаблона, называемый Quaternion где-то в другом месте (в этом случае он выглядит в файле transform.h). Если это один из файлов, который был включен в проект, то это, вероятно, объявление вперед класса, которое больше не допускается спецификацией языка. Вы должны отредактировать заголовок самостоятельно, чтобы исправить проблему.

+0

приведенный выше код из файла transform.h, извините, я не упоминал об этом раньше – Nickal