6
votes

C ++ Surcharge a priorité sur la spécialisation?

Compte tenu du code suivant:

#include <iostream>

using namespace std;

template<typename T> void Print(T t) {
    cout << t << endl;
}

template<> void Print<int>(int t) {
    cout << "int = " << t << endl;
}

void Print(int i) {
    cout << "int2 = " << i << endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
    Print(1.3);
    Print("tese");
    Print(2);

    char c;

    cin >> c;

return 0;
}


4 commentaires

Étant donné que la résolution de la surcharge choisit d'abord la meilleure correspondance de l'ensemble des fonctions normales et des modèles primaires. Seulement quand cela est fait, il cherche des spécialisations. Il y a un article gotw par Herb Sutter sur cet ennemi. ici.


@jrok et c'est incorrect


@Pierrebdr oh. Cela ne s'applique pas dans ce cas, j'admets (mauvaise lecture de ma part) mais c'est correct sinon :)


@jrok ceci n'est pas. La résolution de la surcharge trouve la fonction avec les meilleurs arguments. Dans le cas où deux fonctions disposent exactement de la même liste d'arguments, si l'on est modélisée et que l'autre n'est pas, alors la fonction non modentée a la priorité. C'est beaucoup plus faible que votre déclaration.


3 Réponses :


2
votes

C'est parce que les fonctions autres-modèles sont des citoyens de première classe. Voir Cet article par Herb Sutter ou Ceci alors post pour plus de détails.

de l'article de Herb Sutter:

Les fonctions Nontemplate sont des citoyens de première classe. Une ancienne fonction Nontemplate simple qui correspond aux types de paramètres ainsi que tout modèle de fonction sera sélectionné sur un modèle de fonction sinon aussi bon.

S'il n'y a pas de citoyens de première classe à choisir parmi ceux qui sont au moins aussi bons, puis des modèles de base fonctionnent comme les citoyens de la deuxième classe sont consultés ensuite. Quel modèle de base de fonction est sélectionné dépend de ce qui correspond le mieux et est le "plus spécialisé" (Note importante ": cette utilisation de" spécialisée "assez assez n'a rien à voir avec des spécialisations de modèles; c'est juste un célèbre colloque) selon un ensemble de Règles d'arcan:


0 commentaires

3
votes

section 13.3.3 de la norme, sur le choix de la meilleure fonction d'une surcharge, indique explicitement que, compte tenu du choix entre une fonction modélisée et non modèles ayant exactement la même liste d'arguments, la fonction non modélisée est toujours une mieux adapter que le modèle.


0 commentaires

-2
votes

Parce que vous n'avez pas écrit comme Imprimer (2) .

L'écrire avec des crochets d'angle signifie que vous appelez la fonction de modèle. Puisque vous n'avez pas appelé la fonction de modèle exacte en écrivant des crochets. Il n'est pas en conflit avec aucun de l'appel imprimé (n'importe quel entier); plus tard. Parce que la fonction de modèle n'existe pas à ce moment-là.

Voir la section de brouillon de travail C ++ Résolution de nom sous le titre Modèles . J'espère que cela a aidé.


0 commentaires