【问题标题】:Overloading a multiplication operator in a template class array在模板类数组中重载乘法运算符
【发布时间】:2016-11-11 23:33:32
【问题描述】:

我正在尝试编写一个模板类来制作具有重载乘法运算符的数组。模板类的实际内部看起来很好,但是我遇到了 * 运算符的重载问题。我最初有一个重载运算符用于将常规类中的数组相乘,这里我使用第一个重载运算符作为模板的基础。

这是我的头文件中的内容:

operator * (const Array<T>& a) const;  //*  operator

这是我的主文件中的内容:

template <class T>
Array<T>::operator * (const Array<T>& a) const
{
   if (num != a.num)
   {
       cout << "Error, arrays not equal!" << endl;
   }

   Array<int> tmp;
   delete[] tmp.data;

   tmp.data = new int[cap];
   tmp.num = a.num;
   tmp.cap = a.cap;

   memcpy(tmp.data, a.data, sizeof(int)*num);


   for(int i = 0 ; i < num ; i++)
   {
       tmp.data[i] = tmp.data[i] * a.data[i];
   }  

   return tmp;
}

我收到的错误是告诉我 tmp 有问题。它在函数末尾引用“return tmp”时指出“错误:无法将'Array'转换为'int'作为回报​​”。

我正在尝试将 main() 中创建的两个数组(a 和 c)相乘

Array <int> d = a * c;

存在与数组 d 相关的错误消息,但这些似乎也源于重载运算符函数内部的错误。 tmp 是如何变成 'int' 的?

【问题讨论】:

    标签: c++


    【解决方案1】:

    你需要将Array&lt;int&gt; tmp; 模板化为Array&lt;T&gt; tmp;,这样你memcpy(tmp.data, a.data, sizeof(int)*num); 的内存区域的大小就真的是一样的了。此外,正如@Thecocatrice 所提到的,将 retutn 类型添加到您的重载运算符。 这看起来像

    template<typename T>
    Array<T> Array<T>::operator *(const Array<T> &a) { ... };
    

    最后。你实际上并不需要那个memcpy。它没有任何意义,因为你仍然有循环。随便写:

    for(int i = 0 ; i < num ; i++)
    {
        tmp.data[i] = data[i] * a.data[i];
    } 
    

    【讨论】:

      【解决方案2】:

      您的函数没有返回类型。因此,C++ 将默认为int。 要解决这个问题,请确保函数返回 Array&lt;int&gt;(tmp 的类型)。

      【讨论】:

      • 我相信实际上是编译器执行了默认设置,我认为标准禁止这种行为(C99 也这样做,C++ 没有理由不这样做),但不要认为这是理所当然的
      猜你喜欢
      • 1970-01-01
      • 2016-10-15
      • 2016-06-21
      • 2012-02-07
      • 1970-01-01
      • 2016-04-21
      • 2013-03-24
      • 2023-04-05
      • 2013-02-05
      相关资源
      最近更新 更多