Шаблонные функции класса и друга - PullRequest
0 голосов
/ 01 ноября 2018

У меня очень простой код, в котором я пытаюсь создать шаблон класса. К сожалению, я получаю ошибку с моим кодом для функции друга.

В следующем коде 'myArray' как класс шаблона. Как я могу обработать функцию друга operator *(...) в этом сценарии? С моим текущим кодом я получаю следующую ошибку:

compilation error:error: invalid use of template-name 'myArray'  
without an argument list myArray operator * (myArray &a1, myArray &a2)*/

Вот код:

#include<iostream>
using namespace std;

const int sz = 3;

template <typename T>
class myArray
{
    T *arr;
    const static int size = 3;

public:
    myArray()
    {
        arr = new T[size];
        for (int i=0; i<size; i++)
            arr[i] = 0;
    }

    myArray(T *actArray)
    {
        arr = new T[size];
        for (int i=0; i<size; i++)
            arr[i] = actArray[i];
    }

    void prArray()
    {
        cout<<endl<<endl;
        for (int i=0; i<size; i++)
            cout << "arr [" << i << "] = "  << arr[i] << endl;
    }

    friend myArray operator * (myArray &arr1, myArray &arr2);
 };


myArray operator * (myArray &a1, myArray &a2)
{
myArray product;
for (int i=0; i<sz; i++)
    product.arr[i] = a1.arr[i] * a2.arr[i];

return product; 
}

int main()
{
int xi[3] = {1, 2, 3};
int yi[3] = {5, 5, 5};

float xf[3] = {1.1, 2.1, 3.1};
float yf[3] = {5.5, 5.5, 5.5};

//considering template class as integer
myArray <int>a1;
myArray <int>a2; 
a1 = xi;
a2 = yi;

a1.prArray();
a2.prArray();
cout<<"Interger class..."<<endl;
myArray <int>a3;
a3 = a1 * a2;
a3.prArray();

/*//considering template class as float
myArray <float>b1, <float>b2; 
b1 = xi;
b2 = yi;

b1.prArray();
b2.prArray();
cout<<"Float class..."<<endl;
myArray <float>b3;
b3 = b1 * b2;
b3.prArray();*/
}

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

// Наконец, я определяю функцию друга в самом классе вместе с предложениями Питера .... итоговый код ... Спасибо всем за помощь

Но так и не понял, почему мы сделали это в качестве постоянных параметров ...?

 #include<iostream>
 using namespace std;

template <typename T>
class myArray
{
    T *arr;
    const static int size = 3;

public:
    myArray()
    {
        arr = new T[size];
        for (int i=0; i<size; i++)
            arr[i] = 0;
    }

    myArray(T *actArray)
    {
        arr = new T[size];
        for (int i=0; i<size; i++)
            arr[i] = actArray[i];
    }

    void prArray()
    {
        cout<<endl<<endl;
        for (int i=0; i<size; i++)
            cout << "arr [" << i << "] = "  << arr[i] << endl;
    }

    friend myArray<T> operator* (const myArray<T>& a1, const myArray<T>& a2)
    {
        myArray <T> product;
        for (int i=0; i<size; i++)
            product.arr[i] = a1.arr[i] * a2.arr[i];

        return product; 
    }
};

int main()
{
int xi[3] = {1, 2, 3};
int yi[3] = {5, 5, 5};

float xf[3] = {1.1, 2.1, 3.1};
float yf[3] = {5.5, 5.5, 5.5};

//considering template class as integer
myArray <int>a1;
myArray <int>a2; 
a1 = xi;
a2 = yi;

a1.prArray();
a2.prArray();
cout<<"Interger class..."<<endl;
myArray <int>a3;
a3 = a1 * a2;
a3.prArray();

//considering template class as float
myArray <float>b1;
myArray <float>b2; 
b1 = xf;
b2 = yf;

b1.prArray();
b2.prArray();
cout<<"Float class..."<<endl;
myArray <float>b3;
b3 = b1 * b2;
b3.prArray();
}
0 голосов
/ 02 ноября 2018

Переместите тело operator* в тело класса:

friend myArray operator * (myArray &arr1, myArray &arr2) {
  myArray product;
  for (int i=0; i<sz; i++)
    product.arr[i] = a1.arr[i] * a2.arr[i];

  return product; 
}

Также:

myArray operator*=(myArray const& arr2)& {
  for (int i=0; i<sz; i++)
    arr[i] *= a2.arr[i];

  return *this;
}
friend myArray operator * (myArray arr1, myArray const& arr2) {
  arr1*=arr2;
  return arr1; 
}

при эффективном перемещении уменьшает количество созданных временных объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...