【问题标题】:Defining Operator Overloads Outside Templated Class在模板类外部定义运算符重载
【发布时间】:2012-11-26 05:11:17
【问题描述】:

当我编译以下内容时,

#include 
#include 
#include 

命名空间 ublas = boost::numeric::ublas;

模板  类向量
{
    私人的:

       ublas::vector m_ublas_vec;
       无符号 m_size;

    民众:

       向量(无符号){
          m_size = s;
          m_ublas_vec.resize(m_size);
       }

       T &operator () (无符号 idx) {
          如果(idx >= m_size){
             perror("错误:索引超出范围!\n");
             退出(1);
          }
          返回 m_ublas_vec(idx);
       }

       // 右乘标量。
       模板 
       朋友 Vector 运算符 * (const Vector &, S);

       // 左乘标量。
       模板 
       朋友 Vector 运算符 * (S, const Vector &);
};

模板 
Vector Vector::operator * (const Vector &v_in, S 标量){
   矢量 v_out (v_in.m_size);
   v_out.m_ublas_vec = v_in.m_ublas_vec*static_cast(标量);
   返回 v_out;
}

模板 
Vector Vector::operator * (S 标量, const Vector &v_in){
   矢量 v_out (v_in.m_size);
   v_out.m_ublas_vec = v_in.m_ublas_vec*static_cast(标量);
   返回 v_out;
}

我收到此错误:

vector_test.cpp:49:95: 错误:无效使用不完整类型'class Vector'

vector_test.cpp:7:26: 错误:'class Vector' 的声明

我做错了什么?

【问题讨论】:

    标签: c++ class templates operator-overloading


    【解决方案1】:

    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;
    }
    

    【讨论】:

    • 但是(没有 Vector::operator)它们是全局的,对吗?另外,我不能在类中定义这些重载的原因是因为二进制操作重载在类中定义时只能采用 0 或 1 个参数。
    • 是的,它们是全局的,但这是您在类中使用 friend 函数声明的内容:它们没有声明成员。您不能使重载采用与成员类不同的类型(它最多可以是其他类型的成员)。成员operator+() 只能不带附加参数或附加一个参数;除了第一个参数,this指向的对象,也就是。
    • 啊。现在我开始明白了。谢谢!
    【解决方案2】:

    friend 函数不是类的一部分。您不应该通过 Vector&lt;T&gt;:: 说明符来定义它。正确的是:

    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

    【讨论】:

      猜你喜欢
      • 2021-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-07
      • 2016-10-15
      • 2013-02-05
      • 1970-01-01
      相关资源
      最近更新 更多