Тип карты .... не предоставляет оператор вызова - PullRequest
0 голосов
/ 14 апреля 2020

Попытка реализовать некоторые перегруженные операторы в классе Month:

class Month
{
      int monthNumber;
      string name;
}

Мне удалось без проблем реализовать приведенный ниже конструктор:

Month::Month(int cust_month) 
{
    monthNumber = cust_month;
    name = int_month.at(cust_month);
}

Обратите внимание на использование карты ( не показано) int_month, где int 1-12 сопоставлены с соответствующими названиями месяцев, это прекрасно работает. Но попытка сделать что-то подобное при перегрузке оператора ++:

Month Month::operator++() {
    if (monthNumber == 12) {
        monthNumber = 1;
        name = "January";
    }
    else{
        ++monthNumber;
        name = int_month(monthNumber); // ERROR

    }
    return *this;
}

В приведенном выше фрагменте подсвечивается int_month и выдается ошибка:

Type 'map<int, std::__1::string>' (aka 'map<int, basic_string<char, char_traits<char>, allocator<char> > >') does not provide a call operator

Я прочитал похожие посты и все они решили какую-то программную ошибку, но после прочтения я все еще не уверен, что эта ошибка означает для моего кода. Мне любопытно не только, как решить это, но почему использование карты для присвоения значения по ключу в моем конструкторе работало нормально, но тот же процесс не работает для перегрузки оператора.

1 Ответ

0 голосов
/ 14 апреля 2020

Когда вы читаете ошибку, она говорит вам точно о проблеме:

Type 'map<int, std::__1::string>' (aka 'map<int, basic_string<char, char_traits<char>, allocator<char> > >') does not provide a call operator

У вас есть карта от int до строки, которая не предоставляет оператора вызова. Это означает, что нет функции std::map<...>::operator()(...). Так что вам нужно сделать, чтобы вы go указали на ссылку типа cppreference , и вы увидите, что operator().

нет. Далее вы увидите, что есть раздел Доступ к элементу , который дает вам две функции:

  • at: доступ к указанному элементу с проверкой границ
  • operator[]: доступ или указание вставки element

Это довольно точно говорит о том, какие функции существуют. Если вы проверите это более подробно, вы также увидите сигнатуру функции , например, для operator[]:

T& operator[]( const Key& key );
T& operator[]( Key&& key );

Это означает, что вы можете передать или ссылку на rvalue или const. к значению оператора скобки. Также внимательно прочитайте документацию и примеры кода в конце, чтобы понять, что значения вставляются в map, если они еще не существовали (в отличие от at, который будет выбрасывать, если элемент не существует).

Итак, наконец, пример использования:

std::map<int, std::string> m;
m[3] = "a"; // inserts "a" at position 3
std::cout << m[3]; // prints "a"
m[3] = "b"; // modifies the conetent at 3 to "b"
std::cout << m[3]; // prints "b"

m.at(3) = "c"; // modifies the content at 3 to "c"
std::cout << m[3]; // prints "b"

m.at(4) = "d"; // this will throw std::out_of_range
...