Ошибка C ++: нет подходящей функции для вызова print_size - PullRequest
0 голосов
/ 23 мая 2018

У меня есть этот код:

#include <iostream>
#include <vector>

template<typename T>
void print_size(std::vector<T> a)
{
    std::cout << a.size() << '\n';
}

int main()
{
    std::vector<int> v {1, 2, 3};
    print_size(v);

    auto w = {1, 2, 3};
    // print_size(w); // error: no matching function for call to 'print_size'
                      // candidate template ignored: could not match 'vector' against 'initializer_list'
}

... который компилируется и запускается без проблем.Но если я включу закомментированную строку, она выдаст ошибку no matching function for call to 'print_size'.

Я хотел бы знать, как правильно написать этот код в C ++ 11 и более поздних версиях.

Ответы [ 4 ]

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

Для auto w = {1, 2, 3}; тип w будет std::initializer_list<int>, а print_size(w); завершится ошибкой, поскольку параметр шаблона T не может быть выведен; вывод аргумента шаблона не учитывает неявные преобразования.

Вывод типа не учитывает неявные преобразования (кроме корректировок типов, перечисленных выше): это задача для разрешения перегрузки, которое происходит позже.

Вы можете явно указать аргумент шаблона,

print_size<int>(w);

Или вместо него можно сделать w значением std::vector<int>;и если вы продолжаете использовать auto, вам нужно явно указать тип.

auto w = std::vector<int>{1, 2, 3};
print_size(w);
0 голосов
/ 23 мая 2018

Без руководств по выводу C ++ 17 компилятор не может вывести T для std::vector<T> параметра из аргумента типа std::initializer_list<T>, к сожалению.

Я бы предложил добавить перегрузку для print_size(std::initializer_list<T> const&).

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

Проблема в типе аргумента print_size.Ваш auto w = {1, 2, 3}; имеет тип std::initializer_list<int>, и он не соответствует vector<T>, нет автоматического преобразования.

Таким образом, вы можете исправить print_size следующим образом:

template<class T>
void print_size(std::initializer_list<T> a)
{
    std::cout << a.size() << '\n';
}

Или еще лучше изменить способ параметризации шаблона:

template<class T>
void print_size(const T& a)
{
    std::cout << a.size() << '\n';
}
0 голосов
/ 23 мая 2018

литье будет решением

    print_size((std::vector<int>)w);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...