Частичная специализация функции-члена

Возможный дубликат:
Ошибка «неверное использование неполного типа» с частичной специализацией шаблона

Почему я могу сделать это:

template <typename T>
struct A
{
void foo(int);
};

template <>
void A<int>::foo(int)
{
}

но не это

template <typename> struct C {};

template <typename T>
struct A
{
void foo(int);
};

template <typename T>
void A<C<T> >::foo(int)
{
}

Во втором случае GCC выдает следующую ошибку:

test.cpp:10:23: error: invalid use of incomplete type 'struct A<C<T> >'
test.cpp:4:8: error: declaration of 'struct A<C<T> >'

РЕДАКТИРОВАТЬ:

При объяснении, почему второй пример недопустим, учтите также, что превращение функции-члена в шаблон также не влияет на то, какой пример работает, а какой нет. То есть это все еще работает:

template <typename T>
struct A
{
template <typename U>
void foo(U);
};

template <>
template <typename U>
void A<int>::foo(U)
{
}

но это не

template <typename> struct C {};

template <typename T>
struct A
{
template <typename U>
void foo(U);
};

template <typename T>
template <typename U>
void A<C<T> >::foo(U)
{
}

Поэтому причина не может быть в том, что шаблоны функций могут быть только полностью специализированными, потому что третий пример не является полной специализацией (параметр шаблона U все еще там), и все же это работает.

5

Решение

Шаблоны функций могут быть специализированы только полностью, а не частично.

Вы используете тот факт, что функции-члены шаблонов классов сами являются шаблонами функций, поэтому это правило по-прежнему применяется.


Что касается вашего редактирования: Следующие вещи могут быть явно (то есть полностью) специализированными, начиная с 14.7.3 / 1:

Явная специализация любого из следующего:

— шаблон функции

— шаблон класса

функция-член шаблона класса

— статический член данных шаблона класса

— член класса шаблона класса

— перечисление членов шаблона класса

— шаблон класса члена класса или шаблон класса

шаблон функции-члена класса или шаблон класса

может быть объявлено декларацией template<>;

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

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]