Possible Duplicate:
“invalid use of incomplete type” error with partial template specializationspécialisation partielle de la fonction membre
Pourquoi est-ce que je peux le faire:
template <typename T>
struct A
{
void foo(int);
};
template <>
void A<int>::foo(int)
{
}
mais pas:
template <typename> struct C {};
template <typename T>
struct A
{
void foo(int);
};
template <typename T>
void A<C<T> >::foo(int)
{
}
Pour le second cas, GCC donne l'erreur suivante :
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> >'
EDIT:
En expliquant pourquoi le deuxième exemple n'est pas autorisé, s'il vous plaît considérer aussi que faire la fonction membre également un modèle n'a pas d'effet sur lequel fonctionne par exemple et qui ne fonctionne pas. Autrement dit, cela fonctionne encore:
template <typename T>
struct A
{
template <typename U>
void foo(U);
};
template <>
template <typename U>
void A<int>::foo(U)
{
}
mais cela ne fait pas:
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)
{
}
Donc, la raison ne peut pas être que les modèles de fonction ne peuvent être pleinement spécialisés, parce que le troisième exemple n'est pas une spécialisation complète (le paramètre de template U
est toujours là), et pourtant cela fonctionne.
@Mankarse cela semble être un problème différent. –