如何在模板数组 class 中重载 + 运算符以将具有相同索引的每个元素加在一起

How to overload + operator in a Template array class to add every element with the same Index together

我稍微成功地重载了 + 运算符以将 2 个相同大小的数组加在一起。

这是我当前的代码

//.h 
#pragma once
#include <iostream>

template<typename T, size_t S>
class MyArray {
    public:
        T dataArray[S];

        T& operator[](size_t arrayIndex);
        const T& operator[](size_t arrayIndex) const;

        MyArray<T, S> operator+(const MyArray& secondSummand) const;

        constexpr size_t getSize() const;

        const T at(unsigned int arrayIndex) const;

        void place(int arrayIndex, T arrayValue);

        T* acces();//pointer to first array element
};

template<typename T, size_t S>
inline constexpr size_t MyArray<T, S>::getSize() const {
    return S;
}

template<typename T, size_t S>
inline T& MyArray<T, S>::operator[](size_t arrayIndex) {
    return dataArray[arrayIndex];
}

template<typename T, size_t S>
inline const T& MyArray<T, S>::operator[](size_t arrayIndex) const {
    return dataArray[arrayIndex];
}

template<typename T, size_t S>
inline MyArray<T, S> MyArray<T, S>::operator+(const MyArray& secondSummand) const {

    MyArray returnArray{};
    
    for (unsigned int i = 0; i < S; i++) {
        returnArray[i] = this->at(i) + secondSummand[i];
    }
    return returnArray;
}

template<typename T, size_t S>
inline const T MyArray<T, S>::at(unsigned int arrayIndex) const {
    return dataArray[arrayIndex];
}

template<typename T, size_t S>
inline void MyArray<T, S>::place(int arrayIndex, T arrayValue) {
    dataArray[arrayIndex] = arrayValue;
}

template<typename T, size_t S>
inline T* MyArray<T, S>::acces() {
    return dataArray;
}
//main.cpp

#include <iostream>
#include <random>

#include "MyArray.h"

int main() {
    {
        srand((unsigned)time(0));
    
        //Working fine
        MyArray<int, 5> firstArray = {10, 5, 3, 2, 8};
        MyArray<int, 5> secondArray = {5, 3, 5, 6, 2};
    
        std::cout << "The first Array numbers are:\n";
        for (unsigned int i = 0; i < firstArray.getSize(); i++) {
            std::cout << firstArray[i] << " ";
    
        }
    
        std::cout << "\n\nThe second Array numbers are:\n";
    
        for (unsigned int i = 0; i < secondArray.getSize(); i++) {
            std::cout << secondArray[i] << " ";
        }
    
        MyArray<int, firstArray.getSize()> tempArray = firstArray + secondArray;
    
        std::cout << "\n\nAdd every position of 2 Arrays together:\n";
    
        for (unsigned int i = 0; i < tempArray.getSize(); i++) {
            std::cout << firstArray[i] << " + " << secondArray[i] << " = " << tempArray[i] << "\n";
        }
    
    }

    //Not working
    MyArray<int, 5> firstArray = {10, 5, 3, 2, 8};
    MyArray<int, 4> secondArray = {5, 3, 5, 6};

    std::cout << "\n\nThe first Array numbers are:\n";
    for (unsigned int i = 0; i < firstArray.getSize(); i++) {
        std::cout << firstArray[i] << " ";

    }

    std::cout << "\n\nThe second Array numbers are:\n";

    for (unsigned int i = 0; i < secondArray.getSize(); i++) {
        std::cout << secondArray[i] << " ";
    }
}

所以我的重载运算符适用于具有相同大小的对象(数组)。 如果我尝试添加 2 个不同大小的对象,我会收到类型不相同的错误消息

https://i.stack.imgur.com/7cZG4.png

如果我的理解是正确的,我的 return 类型的 + 运算符是一个 MyArray 对象,它具有与 + 左侧的被加数相同的模板参数。

在我的第二个例子“不工作”中,这应该是 T = int, S = 5 运算符的左侧将是对我的数组的 const 引用,其中 T = int, S = 4

我不明白为什么这不起作用,因为我在没有模板的情况下做了同样的事情并且它工作正常,有人可以向我解释为什么我不能将 2 个不同大小的数组与我的代码一起添加或者我可以做什么它接受不同大小的对象?

提前致谢

在运算符函数的声明中:

MyArray<T, S> operator+(const MyArray& secondSummand) const;

当您使用纯 MyArray 时,它暗示为 MyArray<T, S>。模板参数 TS 与函数参数的“this”class 和 class 相同。

如果你想为你的参数使用不同的大小,那么你也需要使运算符函数成为一个模板,以提供不同大小的

template<size_t R>
MyArray<T, S> operator+(const MyArray<T, R>& secondSummand) const;

请注意,根据 OP .

,我将生成的数组对象的大小保持为与“此”数组对象相同的大小

执行运算符时注意不要越界,你应该只循环到两个对象大小中的最小值,如果S > R那么结果数组的其余部分可能应该是zero-initialized.