Передать std::array в качестве ссылочного параметра

Я могу передать свой массив напрямую, но мне нужно знать, как передать его по ссылке. Я использую новый std::array с типом Element. Я пробовал несколько вещей, но они не работают. Я не уверен, как передать это как ссылку. Я запутался, и я не могу понять это.

Как передать std::array в качестве ссылочного параметра, чтобы избежать копирования всего массива?

Как настроен мой массив:

std::array<Element, 115> Elements =
{{
    /*int aNumber, float awNumber, period_number PERIOD, group_names GROUP_NAME, metal_status METALSTATUS,
    valence_shell Orbital,std::string eName, std::string eSybol);*/
    {},
    {1,     1.00794,        period::PERIOD_ONE,     group::HYDROGEN,        metal::NONMETAL,    shell::S_ORBITAL,   "Hydrogen",     "H"}
}};

Работает

void sortByAtomicNumber(std::array<Element, 115> elements, int minimum, int maximum)
{
    int counter = 1;
    for(;minimum < (maximum+1); minimum++)
    {
        std::cout << counter << ".) " << elements[minimum].getElementName() << std::endl;
        counter++;
    }
}

Пробовал Источник: http://gauravpandey.com/wordpress/?p=602 //я еще не изучил шаблоны...

 template<size_t N>
void sortByAtomicNumber(std::array<int, N> const& arr, int maximum, int minimum) {
    int counter = 1;
    for(;minimum < (maximum+1); minimum++)
    {
        std::cout << counter << ".) " << arr[minimum].getElementName() << std::endl;
        counter++;
    }
}

Ошибка сверху


ошибка: передача 'const value_type {aka const Element}' в качестве аргумента 'this' для 'std::string > > Element::getElementName()' отбрасывает квалификаторы [-fpermissive]



person Andrue    schedule 08.02.2014    source источник
comment
Не делайте ссылку const, потому что тогда вы не сможете изменить массив...   -  person Brian Bi    schedule 08.02.2014
comment
@BrianBi Мне не нужно изменять массив; поэтому я использую массив, а не вектор.   -  person Andrue    schedule 08.02.2014
comment
Ой, я неправильно прочитал, извините.   -  person Brian Bi    schedule 08.02.2014
comment
@BrianBi, ссылка на const была проблемой ...   -  person Andrue    schedule 09.02.2014


Ответы (3)


У вас есть ошибки:

  1. В шаблоне sortByAtomicNumber std::array<int, N> должно быть std::array<Element, N>.

  2. Если вы хотите вызвать функцию константного объекта, эта функция должна быть константной. Таким образом, ваша ссылка arr является константной, void getElementName(); класса Element должна быть void getElementName() const;.

  3. Если вы хотите вызвать неконстантную функцию объекта, объект должен быть неконстантным. Таким образом, template<size_t N> void sortByAtomicNumber(std::array<int, N> const& arr, int maximum, int minimum) { /* your code */ } должно быть template<size_t N> void sortByAtomicNumber(std::array<Element, N>& arr, int maximum, int minimum) { /* your code */ }, как сказал @portforwardpodcast.

Примечание. О функции const класса const см. этой статьи. Надеюсь, это поможет вам.

person Alex Chi    schedule 08.02.2014
comment
Спасибо за ссылку. Это многое объясняет. Если бы я все обдумал, то ответ был бы очевиден. - person Andrue; 09.02.2014

Попробуй это:

void sortByAtomicNumber(std::array<Element, 115> &elements, int minimum, int maximum)
{
    int counter = 1;
    for(;minimum < (maximum+1); minimum++)
    {
        std::cout << counter << ".) " << elements[minimum].getElementName() << std::endl;
        counter++;
    }
}
person benathon    schedule 08.02.2014
comment
Я бы предложил использовать typedef для std::array‹Element, 115› - person user3159253; 08.02.2014
comment
Извини. Я только что обновил свой вопрос; Я уже исправил проблему типа и проблему именования. Однако, когда я это делаю, я получаю эту ошибку: неопределенная ссылка на `sortByAtomicNumber(std::array‹Element, 115u›, int, int) - person Andrue; 08.02.2014
comment
откуда ты это звонишь? возможно, у вас есть несоответствие между файлами .h и .c. Поскольку вы не опубликовали очень много кода, мне будет очень сложно ответить без дополнительной информации. - person benathon; 08.02.2014
comment
Спасибо. Я сравнил ваш код со своим и подумал, что это то же самое... У меня все еще была константа в моей функции. Спасибо. - person Andrue; 09.02.2014

Ваше определение функции выглядит неправильно, const находится не в том месте: вы дали это определение:

template<size_t N>
void sortByAtomicNumber(std::array<int, N> const& arr, int maximum, int minimum)
{
    ...
}

Должен быть:

template<size_t N>
void sortByAtomicNumber(const std::array<int, N>& arr, int maximum, int minimum)
{
    ...
}
person loluta    schedule 02.07.2021
comment
Оба ваших определения делают одно и то же, const перемещается, но эффект идентичен. В обоих параметр является константной ссылкой на std::array. - person Blastfurnace; 04.07.2021