簡體   English   中英

在模板類之外定義運算符重載

[英]Defining Operator Overloads Outside Templated Class

當我編譯以下內容時,

#include <boost/numeric/ublas/vector.hpp>
#include <iomanip>
#include <stdio.h>

namespace ublas = boost::numeric::ublas;

template <class T> class Vector
{
    private:

       ublas::vector<T> m_ublas_vec;
       unsigned m_size;

    public:

       Vector(unsigned s){
          m_size = s;
          m_ublas_vec.resize(m_size);
       }

       T &operator () (unsigned idx) {
          if(idx >= m_size){
             perror("ERROR: Index out of bounds!\n");
             exit(1);
          }
          return m_ublas_vec(idx);
       }

       // Right-multiply by scalar.
       template <class TT, class S>
       friend Vector<TT> operator * (const Vector<TT> &, S);

       // Left multiply by scalar.
       template <class TT, class S>
       friend Vector<TT> operator * (S, const Vector<TT> &);
};

template <class T, class S>
Vector<T> Vector<T>::operator * (const Vector<T> &v_in, S scalar){
   Vector<T> v_out (v_in.m_size);
   v_out.m_ublas_vec = v_in.m_ublas_vec*static_cast<T>(scalar);
   return v_out;
}

template <class T, class S>
Vector<T> Vector<T>::operator * (S scalar, const Vector<T> &v_in){
   Vector<T> v_out (v_in.m_size);
   v_out.m_ublas_vec = v_in.m_ublas_vec*static_cast<T>(scalar);
   return v_out;
}

我收到此錯誤:

vector_test.cpp:49:95:錯誤:無效使用了不完整的類型'class Vector'

vector_test.cpp:7:26:錯誤:“類Vector”的聲明

我究竟做錯了什么?

您的friend函數不聲明成員函數。 因此,您想將它們定義為

template <class T, class S>
Vector<T> operator * (const Vector<T> &v_in, S scalar){
   Vector<T> v_out (v_in.m_size);
   v_out.m_ublas_vec = v_in.m_ublas_vec*static_cast<T>(scalar);
   return v_out;
}

template <class T, class S>
Vector<T> operator * (S scalar, const Vector<T> &v_in){
   Vector<T> v_out (v_in.m_size);
   v_out.m_ublas_vec = v_in.m_ublas_vec*static_cast<T>(scalar);
   return v_out;
}

friend功能不是課程的一部分。 您不應通過Vector<T>::說明符對其進行定義。 正確的一個是:

template <class T, class S>
Vector<T> operator * (const Vector<T> &v_in, S scalar){
   Vector<T> v_out (v_in.m_size);
   v_out.m_ublas_vec = v_in.m_ublas_vec*static_cast<T>(scalar);
   return v_out;
}

template <class T, class S>
Vector<T> operator * (S scalar, const Vector<T> &v_in){
   Vector<T> v_out (v_in.m_size);
   v_out.m_ublas_vec = v_in.m_ublas_vec*static_cast<T>(scalar);
   return v_out;
}

檢查: http//ideone.com/8n9UO1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM