2013-11-09 3 views
3

В коде есть ошибка, но я не знаю, как ее решить. В нем указано «слишком мало шаблонов параметров». Я не понимаю, какая ошибка.Ошибка «слишком мало шаблонов параметров»

Вот код:

#if !defined(VECTOR_H_INCLUDED) 
#   define   VECTOR_H_INCLUDED 


namespace Vec 
{ 
    class Vector_base 
    { 
      public: 
        explicit Vector_base() {} 
        virtual ~Vector_base() {} 

    }; 

    template<typename T, int DIM> 
    class Vector : public Vector_base 
    { 
      typedef Vector<T,DIM> ME; 
      public: 
        explicit Vector() 
        { 
          memset(&v, 0, sizeof(v)); 
        } 

        explicit Vector(T v[DIM]) 
        { 
          memcpy(this->v, v, sizeof(this->v)); 
        } 

        explicit Vector(T,T,T); 

        virtual ~Vector() 
        { 

        } 

        // Operators 

        T &operator [](size_t n) 
        { 
          return v[n]; 
        } 

        T operator [](size_t n) const 
        { 
          return v[n]; 
        } 

        ME &operator += (const ME& o) 
        { 
          for (size_t i=0; i<DIM; ++i) 
          { 
            v[i] += o[i]; 
          } 
          return *this; 
        } 

        ME &operator -= (const ME& o) 
        { 
          for (size_t i=0; i<DIM; ++i) 
          { 
            v[i] -= o[i]; 
          } 
          return *this; 
        } 

        ME &operator *= (const ME& o) 
        { 
          for (size_t i=0; i<DIM; ++i) 
          { 
            v[i] *= o[i]; 
          } 
          return *this; 
        } 

        ME &operator /= (const ME& o) 
        { 
          for (size_t i=0; i<DIM; ++i) 
          { 
            v[i] /= o[i]; 
          } 
          return *this; 
        } 


        ME &operator *= (double scalar) 
        { 
          for (size_t i=0; i<DIM; ++i) 
          { 
            v[i] *= scalar; 
          } 
          return *this; 
        } 

        ME &operator /= (double scalar) 
        { 
          for (size_t i=0; i<DIM; ++i) 
          { 
            v[i] /= scalar; 
          } 
          return *this; 
        } 


        const ME operator-(const ME &o) const 
        { 
          ME result = *this; 
          result -= o; 
          return result; 
        } 

        const ME operator+(const ME &o) const 
        { 
          ME result = *this; 
          result += o; 
          return result; 
        } 

        const ME operator*(const ME &o) const 
        { 
          ME result = *this; 
          result *= o; 
          return result; 
        } 

        const ME operator*(double scalar) const 
        { 
          ME result = *this; 
          result *= scalar; 
          return result; 
        } 

        const ME operator/(const ME &o) const 
        { 
          ME result = *this; 
          result /= o; 
          return result; 
        } 

        const ME operator/(double scalar) const 
        { 
          ME result = *this; 
          result /= scalar; 
          return result; 
        } 



        // Misc stuff 
        ME &get() 
        { 
          return v; 
        } 

        double length() 
        { 
          double temp = 0.0f; 

          for (size_t i=0; i<DIM; ++i) 
          { 
            temp += v[i] * v[i]; 
          } 

          return sqrtf(temp); 
        } 

        void normalize() 
        { 
          double len = length(); 

          for (size_t i=0; i<DIM; ++i) 
          { 
            v[i] /= len; 
          } 

        } 

        double dot(const ME &v) const; 


      private: 
        T v[DIM]; 
    }; 


    typedef Vector<double,3> Vector3; 



    double Vector3::dot(const ME &o) const // ----- it gives me the error here ... 
    { 
      return v[0] * o[0] + v[1] * o[1] + v[2] * o[2]; 
    } 

    Vector3::Vector(double x, double y, double z) // ----- ... and here 
    { 
      v[0] = x; 
      v[1] = y; 
      v[2] = z; 
    } 

} 

#endif // VECTOR_H_INCLUDED 

Что я должен изменить?

Заранее спасибо. И извините за мой английский, я изучаю английский в школе как вторичный язык.

ответ

5

Здесь вы должны использовать template<>, чтобы сделать специализированные шаблоны.

template<> double Vector3::dot(const ME &o) const 

и

template<> Vector3::Vector(double x, double y, double z) 
+1

Ах, спасибо. Теперь это работает! :) – Ale

Смежные вопросы