【问题标题】:How to overload + operator for arrays in C++?如何在 C++ 中为数组重载 + 运算符?
【发布时间】:2021-08-18 18:29:24
【问题描述】:

对于学校的 C++ 练习,我需要重载 + 运算符来连接 2 个数组。我需要在一个泛型类中做到这一点。

例如:

a1 = {1, 3, 4}
a2 = {2, 3, 5, 6}
=> a = {1, 3, 4, 2, 3, 5, 6}

我有这段代码,但它不起作用。

#include <iostream>
#include <array>

using namespace std;

template <class T>
T operator+(const T& a1, const T& a2)
{
  T a;
  for (typename T::size_type i = 0; i < a1.size() + a2.size; i++) {
      if (i < a1.size()) {
        a[i] = a1[i];
      } else {
          a[i] = a2[i];
      }
  }
  return a;
}

int main()
{
  array<int,3> a1 = { 1, 3, 4 };
  array<int,4> a2 = { 2, 3, 5, 6 };
  array<int,7> a3 = a1 + a2;

  for (int i = 0; i < 5; i++)
    cout << a1[i] << '+' << a2[i] << '=' << a3[i] << ' ';

  cout << endl;
  return 0;
}

此代码不起作用,这是我在控制台中收到的:

main.cpp:32:24: error: no match for ‘operator+’ (operand types are ‘std::array’ and ‘std::array’)
   array<int,7> a3 = a1 + a2;
                     ~~~^~~~
main.cpp:15:3: note: candidate: template T operator+(const T&, const T&)
 T operator+(const T& a1, const T& a2)

我应该怎么做才能解决这个问题?还有一个问题,这段代码是否使用泛型类?任何反馈将不胜感激!

【问题讨论】:

  • T operator+(const T&amp; a1, const T&amp; a2) 都是一样的Ts,但是array&lt;int,3&gt;&lt;array&lt;int,4&gt;array&lt;int,4&gt; 是不同的类型
  • 是的,你的 operator+ 说你可以将一个类型添加到相同的类型并获得相同的类型,但这不是你在 main 函数中尝试做的。
  • 我是一名 Java 开发人员 -- 这与您所问的 C++ 问题是否相关?您是否试图让 C++ 代码看起来像 Java?
  • main 的部分看起来像你想要的元素 + 但实施看起来像你想要连接。你到底想要什么?
  • 我需要在泛型类中这样做。 -- 我没有看到泛型类。我看到了一个独立的模板函数。

标签: c++ arrays templates operator-overloading operators


【解决方案1】:

T operator+(const T&amp; a1, const T&amp; a2) 接受两个Ts 作为参数并返回一个T。这不是你想要的。

这是您可以使用operator+ 连接两个数组的方法:

#include <iostream>
#include <array>

    
template <typename T,size_t M,size_t N>
std::array<T,M+N> operator+(const std::array<T,M>& a1, const std::array<T,N>& a2) {
  std::array<T,M+N> a;
  for (size_t i = 0; i < M; ++i) {
      a[i] = a1[i];
  }
  for (size_t i = 0; i < N; ++i) {
      a[i + M] = a2[i];
  }
  return a;
}

int main() {
    std::array<int,3> a1 = { 1, 3, 4 };
    std::array<int,4> a2 = { 2, 3, 5, 6 };
    std::array<int,7> a3 = a1 + a2;

    for (const auto& e : a3){
        std::cout << e << " ";
    } 

    std::cout << "\n";
}

您的代码以某种方式混合了元素加法和连接。并且在operator+ 的实现中存在一些拼写错误(例如size 而不是size() 和访问a2 越界)。

还有一个问题,这段代码使用泛型类吗?

没有。您的operator+(和上面的那个)是一项免费功能。 std::array 是一个通用容器,std::array&lt;int,N&gt; 是一个类。

【讨论】:

  • 感谢您的帮助!以及如何将其转化为泛型类?
  • @elvis 我不知道那是什么意思。你得问问你的导师。正如我所写,std::array 是通用的,它是一个类模板(它不是一个类)。 std::array&lt;int,3&gt; 是一个类,但它不是通用的。 “泛型类”在 C++ 中不是一个常用术语,至少对我来说不是
  • @elvis 无论如何,在措辞上挑剔,我真的不知道他们希望您如何为此使用类模板
猜你喜欢
  • 2016-08-30
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2018-11-27
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多