4

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.

+0

@Mankarse cela semble être un problème différent. –

Répondre

6

Les modèles de fonction ne peuvent être entièrement spécialisés que partiellement.

Vous utilisez le fait que les fonctions membres des modèles de classe sont elles-mêmes des modèles de fonction, donc cette règle s'applique toujours.


Quant à votre édition: Les choses suivantes peuvent être qu'explicitement (complètement) spécialisée, de 14.7.3/1:

An explicit specialization of any of the following:

— function template

— class template

member function of a class template

— static data member of a class template

— member class of a class template

— member enumeration of a class template

— member class template of a class or class template

member function template of a class or class template

can be declared by a declaration introduced by template<>;

J'ai souligné les deux énoncés qui se rapportent à votre cas . En l'absence de toute autre disposition explicite, ces entités peuvent être spécialisées partiellement.

+0

Je ne suis pas sûr d'avoir acheté cette explication. Supposons que je fasse fonctionner le membre lui-même comme un modèle, avec le paramètre de modèle 'U'. Ensuite, je peux toujours définir 'A :: foo (U)', mais pas 'A > :: foo (U)'. Cependant, le premier peut difficilement être considéré comme une spécialisation complète, car il a un paramètre de modèle («U»). – HighCommander4

+0

@ HighCommander4: J'ai dit "fonction de membre", pas "modèle de membre". Si vous changez la question, je change la réponse :-) –

+0

Fait, s'il vous plaît voir mon edit :) – HighCommander4

Questions connexes