Возможный дубликат:
Ошибка «неверное использование неполного типа» с частичной специализацией шаблона
Почему я могу сделать это:
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
все еще там), и все же это работает.
Шаблоны функций могут быть специализированы только полностью, а не частично.
Вы используете тот факт, что функции-члены шаблонов классов сами являются шаблонами функций, поэтому это правило по-прежнему применяется.
Что касается вашего редактирования: Следующие вещи могут быть явно (то есть полностью) специализированными, начиная с 14.7.3 / 1:
Явная специализация любого из следующего:
— шаблон функции
— шаблон класса
— функция-член шаблона класса
— статический член данных шаблона класса
— член класса шаблона класса
— перечисление членов шаблона класса
— шаблон класса члена класса или шаблон класса
— шаблон функции-члена класса или шаблон класса
может быть объявлено декларацией
template<>;
Я подчеркнул два утверждения, которые относятся к вашему делу. В отсутствие каких-либо других явных положений эти лица могут не быть специализированным частично.
Других решений пока нет …