2010-06-29 6 views
1

EDIT AVANT DE LIRE: Désolé ... Je n'ai pas ajouté newline donc il est apparu brouillé, je ne peux pas supprimer la question parce que je ne suis pas encore inscrit, désolé de perdre votre temps les gars.Simple modèle simple retournant des nombres impairs?

J'ai juste utilisé un modèle pour la première fois (pour trouver MIN de deux nombres) au lieu d'une macro, et j'ai aimé! Mais quand j'ai essayé de modifier et de faire mon propre modèle, il a complètement échoué .. Voici mon code:

#include <stdio.h> 

template <class T> T min(T a, T b) { 
    return a < b ? a : b; 
}; 

//My attempt now.. because add could be int, float, etc; I wanted a template. 
template <class T> T add(T a, T b) { 
    return a + b; 
}; 

int main(){ 

    printf("%f\n", min(1.3, 2.2)); //(Does not appear in console?) 
    printf("%d", add(1, 10));  //1.300000 (how is an int show as float? lol) 
    printf("%f", add(5.1, 7.34)); //1112.440000 
    return 0; 
} 

Maintenant, les résultats sont étranges dans les commentaires .. Min fonctionne très bien, mais quand je le change de la comparaison à "a + b" ça arrête de fonctionner et me donne des valeurs flottantes étranges?!

Est-ce que je l'utilise dans le mauvais sens? , est-ce censé être quelque chose d'autre? Qu'est-ce que ça veut dire? Je comprends les bases donc une explication simple serait bien. Merci!

+2

ne soyez pas désolé, juste accepter la bonne réponse. –

Répondre

3

Essayez d'ajouter des sauts de ligne après les autres lignes.

Ce qui se passe est ceci:

  1. imprime min(1.3, 2.2) qui est 1.300000
  2. il imprime un linebreak
  3. il imprime add(1, 10), qui est 11
  4. il imprime add(5.1, 7.34) qui est 12.440000

S Etant donné qu'il n'y a pas de saut de ligne entre les étapes 3 et 4, il imprime le nombre directement les uns après les autres, ce qui donne l'apparence suivante: 1112.440000.

+0

Ouais, l'homme je suis parfois stupide :(Merci –

0

Une fois que vous êtes à remplacer les habitudes C, consultez flux:

int main() 
{ 
    std::cout << min(1.3, 2.2) << '\n' 
       << add(1, 10) << '\n' 
       << add(5.1, 7.34) << '\n'; 
    return 0; 
} 
+1

Point-virgule manquant? Et ne devrait-il pas être «endl» plutôt que «0» –

+1

@Paul: Merci d'avoir attrapé le point-virgule, je l'ai réparé. Cependant, vous avez rarement besoin de vider le flux manuellement, ce que fait 'std :: endl' en plus de la sortie d'un' '\ n'', donc 'std :: endl' est presque toujours inutile, parfois c'est faux J'ai vu une application écrire des données extensivement à l'accélération du disque par un facteur de près de 10, quand quelques 'std :: endl' critiques ont été remplacés par' '\ n''' Donc mon conseil serait de ne jamais utiliser 'std :: endl' quand vous voulez vraiment vider le flux. (Dans l'exemple ci-dessus le flux sera vidé par le nettoyage de l'application en quittant' main() 'de toute façon.) – sbi

+0

point intéressant à propos de' endl' versus ''\ n '' - Je n'avais pas considéré cette subtilité auparavant - merci pour la clarification. –