2009-05-31 5 views
5

A ont une fonction avec un prototype de:Comment créer un prototype de fonction avec des paramètres ayant des valeurs par défaut?

void arryprnt(int[], string, int, string, string); 

Et une définition:

void arryprnt(int[] a, string intro, int len, string sep=", ", string end=".") { 
// stuff 
} 

Et je vous appelle comme ça:

arryprnt(jimmy, "PSEUDOJIMMY: ", 15); 

... Quand Je fais cet appel à arryprnt, j'obtiens une erreur de compilateur disant que j'ai utilisé trop peu d'arguments, basé sur ce que dit le prototype. "D'accord", je pense, "Le compilateur ne sait pas que certains paramètres de arryprnt ont des valeurs par défaut, je copierai simplement les paramètres de la définition dans le prototype." Et j'ai fait, cependant, j'ai eu une erreur de compilateur me disant que j'appelais arryprnt avec trop d'arguments! Je pourrais juste spécifier explicitement tous les arguments, mais est-il possible de l'appeler sans spécifier tous les arguments?

Répondre

20

Vous devriez mettre les arguments par défaut dans le prototype, pas à la définition comme ceci:

void arryprnt(int[] a, string intro, int len, string sep=", ", string end="."); 

et faire la définition sans eux

void arryprnt(int[] a, string intro, int len, string sep, string end) { 
    // ... 
} 

BTW: sur une autre note. Il est considéré comme une bonne pratique de passer des objets de taille supérieure à un int par const référence. Bien que ce ne soit pas approprié pour toutes les situations, il est approprié pour la plupart et évite de copier des choses inutilement. Par exemple:

void func(const std::string &s) { 
    // do some read-only operation with s. 
} 

func("hello world"); 
+0

Umm ... D'une manière ou d'une autre cela n'a pas fonctionné. Je reçois l'erreur "trop ​​d'arguments". – Xonara

+2

Si cela ne fonctionne pas, alors vous faites quelque chose de mal. Je ne suis pas sûr de ce qui causerait ce problème, mais c'est la bonne façon de le faire. –

Questions connexes