Соответствует массиву фиксированного размера класса CRTP - PullRequest
0 голосов
/ 24 октября 2011

его шаблоны снова ;-) Учитывая следующие функции-члены шаблона и класс CRTP:

template<typename T>
struct base
{
   ...
};

struct derived : public base<derived>
{
   ...
};

struct some_class
{
    template<typename T>
    void match(base<T>* array, size_t count)
    {
        ...
    };

    template<typename T, size_t count>
    void match(base<T> (&array)[count])
    {
        ...
    };
};

Почему компилятор не находит соответствия для второй функции:

derived array[10];
some_class foo;

foo.match(array, 10); // works fine
foo.match(array);     // Error: no matching function for call to some_class::match(derived array[10])

Я ожидаю, что вторая функция шаблона может вычесть размер массива fixde во время компиляции, но, очевидно, эта функция не рассматривается.Почему?

Спасибо

Редактировать: странно следующая версия компилируется нормально:

    template<typename T, size_t count>
    void match(T (&array)[count])
    {
        ...
    };

Так что я подозреваю, что в какой-то момент оригинальная версия по какой-то причине исключается.просто не вижу.

1 Ответ

1 голос
/ 24 октября 2011

Массив Derived не может быть преобразован в массив Base.Если вы когда-нибудь что-нибудь сделали с массивом, кроме доступа к первому элементу в первом конструкторе, это было бы неопределенным поведением.

Правильный выбор ссылки защищает вас от этой ситуации, поскольку код не компилируется.Тем не менее, будет скомпилироваться путем разложения массива на один указатель, который может затухать до указателя на Base, что делает перегрузку Base<T>* жизнеспособной, но все же плохой.

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