Шаблоны выражений требуют избыточной перегрузки - PullRequest
0 голосов
/ 29 мая 2018

Я создаю простой класс массива на основе шаблонов выражений.В приведенном ниже коде мне нужно создать перегрузку функции 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;
};

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

У вас есть член const, поэтому он не может быть перезаписан:

const int itot;

, поэтому копирование по умолчанию отключено.

Кажется, const следует удалить.

но тогда копия по умолчанию просто скопирует указатель double* data;

Возможно, вам просто нужно std::vector<double>.

0 голосов
/ 29 мая 2018

Даже если вы не написали это явно, неявно удаленный оператор присвоения копии все еще «существует» и является лучшим соответствием, чем шаблонный, именно поэтому он выбирается, когда вы назначаете из Array_1d.

Вы можете явно вызывать шаблонный метод из не шаблонного:

Array_1d& operator= (const Array_1d& __restrict__ expression)
{
    return this->operator=<Array_1d>(expression);
}
...