Почему std::multiset не работает с константами?

177
15 декабря 2019, 00:30

Почему уже при создании множества, вылетает ошибка, хотя не был изменен массив?

Пример кода:

#include <bits/stdc++.h>
class B {
public:
    std::array<int, 3> b;
    void constFunc() const {    // error
//    void constFunc() {          // done
        std::multiset<std::reference_wrapper<int> > ms;
        ms.insert(b.begin(), b.end());
    }
};
int main() {
    B b;
    b.constFunc();
    std::cout << '\n';
}

Как можно исправить ситуацию, оставляя прототип с константой и не создавая копию массива?

Answer 1

Так как void constFunc() const отмечен как const, для него b имеет тип const std::array<int, 3>. Значит *b.begin() (и подобные выражения) имеет тип const int.

А std::reference_wrapper<int> может ссылаться только на неконстантные intы.

Пытаться поместить ссылку на const int в std::multiset<std::reference_wrapper<int>> - это все равно что пытаться сделать что-то вроде:

const int a = 1;
int &b = a; // ошибка

Как подсказывают в комментариях, можно использовать:

std::multiset<std::reference_wrapper<const int>> ms;

Либо, если вам на самом деле не нужны ссылки, можно сделать:

std::multiset<int> ms;

Либо можно убрать const с метода.

READ ALSO
Как добавить запись в JSON Qt C++

Как добавить запись в JSON Qt C++

Есть Json такой структуры:

197
error C2011: &#39;Game&#39;: &#39;struct&#39; type redefinition

error C2011: 'Game': 'struct' type redefinition

У вас в gameh есть структура

183
Как сократить данный участок кода или можно ли в java передать метод в качестве параметра метода?

Как сократить данный участок кода или можно ли в java передать метод в качестве параметра метода?

У меня есть 3 метода и для каждого прописаны одни и те же участки кодакак сократить данный участок кода?

218