Нет члена с именем 'sum' в 'std :: slice_array <int>' - PullRequest
0 голосов
/ 03 ноября 2019

Вот код, который не может быть скомпилирован любым компилятором, по крайней мере c +++ 11-совместимым (пробовал в godbolt):

#include <valarray>
#include <vector>
#include <iostream>

class Whatever {
public:
    int sliceSum(const std::vector<int>& nums, int k) const {
        std::valarray<int> data(nums.size());
        for (int i = 0; i < nums.size(); ++i) {
            data[i] = nums[i];
        }
        // Here we have St11slice_arrayIiE
        std::cout << typeid(decltype(data[std::slice(0, k, 1)])).name() << std::endl;
        return data[std::slice(0, k, 1)].sum();
    }
};

class Matrix {
    std::valarray<int> data;
    int dim;
 public:
    Matrix(int r, int c) : data(r*c), dim(c) {}
    int& operator()(int r, int c) {return data[r*dim + c];}
    int trace() const {
        // Here we have St5_ExprISt6_SClosISt9_ValArrayiEiE
        std::cout << typeid(decltype(data[std::slice(0, dim, 1)])).name() << std::endl;
        return data[std::slice(0, dim, 1)].sum();
    }
};
int main()
{
    Matrix m(3,3);
    int n = 0;
    for(int r=0; r<3; ++r)
       for(int c=0; c<3; ++c)
           m(r, c) = ++n;
    Whatever s;
    s.sliceSum({1,2,3}, 3);
    m.trace();
}

Класс Matrix взят из https://en.cppreference.com/w/cpp/numeric/valarray/slice икласс Whatever мой.

Так что я не понимаю, в чем проблема и почему типы различаются в двух одинаковых (?) случаях.

1 Ответ

1 голос
/ 03 ноября 2019

Это потому, что в случае Matrix data равно const (поскольку метод const и data является членом), тогда как в случае Whatever data не равно const (поскольку он объявлен неконстантным в самом методе).

Если вы посмотрите на объявления operator[] для std::valarray, вы увидите, что у него есть два operator[], которыепринять параметр слайса, один const, а другой - не const.

. Версия const возвращает std::valarray, который имеет метод sum, non-const возвращает std::slice_array, чтоне.

Чтобы исправить это, оберните результат в std::valarray:

return std::valarray(data[std::slice(0, k, 1)]).sum();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...