"не удалось сопоставить 'T [S]' с 'std :: vector <int>'" для некоторых функций, но не для других с тем же списком параметров - PullRequest
3 голосов
/ 23 марта 2020

Для домашнего задания я пытаюсь создать свои собственные версии std::find, std::begin, std::end и std::size.

Я написал некоторый код, похожий на это:

#include <vector>

template <typename I, typename T>
I find(const I& beg, const I& end, const T& sought)
    {/* ... */}

template <typename T, size_t S>
T* begin(T (&a)[S])
    {return &a;}

template <typename T, size_t S>
T* end(T (&a)[S])
    {return &a + S;}

template <typename T, size_t S>
constexpr size_t size(T (&)[S])
    {return S;}

int main()
{
    std::vector<int> vec = {0, 1, 2, 3};

    // ...

    // test not-found case (and `size()`)
    find(begin(vec), end(vec), size(vec));

    // ...

    return 0;
}

(size_t должно неявно преобразовываться в int)

Однако при компиляции clang выдает следующую ошибку:

$ clang++ -o program ./*.cpp -std=c++11 -Wall -Wextra -Wpedantic -Wconversion -Wnon-virtual-dtor
./main.cpp:##:##: error: no matching function for call to 'size'
    find(begin(vec), end(vec), size(vec)
    ^~~~
./main.cpp:##:##: note: candidate template ignored: could not match 'T [S]' against 'std::vector<int>'
constexpr size_t size(T (&)[S])
                 ^
1 error generated.

Что меня действительно сбивает с толку, так это то, что и size(), и begin() / end() имеют одинаковую структуру шаблона и список параметров, и тем не менее первый выдает ошибку компиляции, в то время как последние не дают, когда передается один и тот же ввод.

Я не думаю, что проблема заключается в другом типе возвращаемого значения, поскольку, если бы оно было find(), было бы жаловаться, а не size().

Так чем же size() отличается от других функций? что будет выдавать эту ошибку с той же структурой шаблона, списком параметров и вводом?

1 Ответ

7 голосов
/ 23 марта 2020

Ни один из ваших шаблонов begin / end / size не совпадает, поскольку они соответствуют только для необработанных массивов (тип T[S]), а не для используемого вами типа (std::vector<T>). Вы получаете только одну ошибку, потому что вызовы begin и end будут соответствовать функциям std::begin и std::end из-за зависимого от аргумента поиска . Не существует функции std::size (в C ++ 11), поэтому единственное возможное совпадение для size - это ваша функция size, которая не соответствует, поэтому вы получите ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...