Qui est non-ressort contexte. C'est pourquoi l'argument de modèle ne peut pas être déduite par le compilateur.
Imaginez, vous pourriez avoir spécialisée TMap
comme suit:
template <>
struct TMap<SomeType>
{
typedef std::map <double, double> Type;
};
Comment le compilateur déduire le type SomeType
, étant donné qu' TMap<SomeType>::Type
est std::map<double, double>
? Il ne peut pas. Ce n'est PAS garanti que le type que vous utilisez, en std::map
est également le type en TMap
. Le compilateur ne peut pas faire ce dangereux hypothèse. Il peut ne pas y aucune relation entre le type d' arguments, que ce soit.
Aussi, vous pourriez avoir d'autres spécialisation de l' TMap
défini comme:
template <>
struct TMap<OtherType>
{
typedef std::map <double, double> Type;
};
Cela rend la situation encore pire. Maintenant que vous avez les éléments suivants:
-
TMap<SomeType>::Type
= std::map<double, double>
.
-
TMap<OtherType>::Type
= std::map<double, double>
.
Maintenant demandez-vous: donnée TMap<T>::Type
est std::map<double, double>
, comment le compilateur de savoir si T
est SomeType
ou OtherType
? Il ne peut même pas savoir combien de ces choix qu'elle a, ni ne peut-il connaître les choix eux-mêmes.. je suis juste vous demander, pour l'amour de la pensée-expérience (en supposant qu'il peut connaître l'ensemble des choix).