Я создаю простой класс массива на основе шаблонов выражений.В приведенном ниже коде мне нужно создать перегрузку функции operator=
, чтобы она работала, даже если она является точной копией функции выше.Причина (в соответствии с GCC) в том, что компилятор отключил назначение копирования по умолчанию.Есть ли способ избежать перегрузки и туннелировать ее через шаблонную функцию?
Основная программа:
#include <iostream>
#include "Array.hpp"
int main()
{
const int itot = 10;
Array_1d a(itot);
Array_1d b(itot);
for (int i=0; i<itot; ++i)
a(i) = i;
b = 0.;
a.print();
b(7,10) = a(1,4);
b.print();
}
Заголовок Array_1d
:
#include <vector>
#include <iostream>
class Array_1d
{
public:
Array_1d(const int itot) :
itot(itot), data(nullptr)
{
data = new double[itot];
}
Array_1d(const int itot, double* data) :
itot(itot), data(data)
{}
// Deletion needs to be solved.
~Array_1d()
{}
void print()
{
for (int i=0; i<itot; ++i)
std::cout << i << " = " << (*this)(i) << std::endl;
}
double& operator()(const int i) { return data[i]; }
double operator()(const int i) const { return data[i]; }
Array_1d operator()(const int is, const int ie) const { return Array_1d(ie-is, data+is); }
template<class T>
inline Array_1d& operator= (const T& __restrict__ expression)
{
for (int i=0; i<itot; ++i)
(*this)(i) = expression(i);
return *this;
}
// Why is this specialization necessary?
inline Array_1d& operator= (const Array_1d& __restrict__ expression)
{
for (int i=0; i<itot; ++i)
(*this)(i) = expression(i);
return *this;
}
inline Array_1d& operator= (const double value)
{
for (int i=0; i<itot; ++i)
(*this)(i) = value;
return *this;
}
private:
const int itot;
double* data;
};