2009-05-31 13 views
5

A tienen una función con un prototipo de:¿Cómo se hace un prototipo de una función con parámetros que tienen valores predeterminados?

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

y una definición de:

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

Y lo estoy llamando así:

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

... Cuando Hago esa llamada a arryprnt, obtengo un error de compilación que dice que he usado muy pocos argumentos, basados ​​en lo que dice el prototipo. "Está bien", estoy pensando, "El compilador no sabe que algunos de los parámetros de Arryprnt tienen valores predeterminados. Copiaré los parámetros de la definición en el prototipo". Y lo hice, sin embargo, recibí un error de compilación que me decía que estaba llamando a arryprnt con demasiados argumentos! Podría especificar explícitamente todos los argumentos, pero ¿hay alguna forma de invocarlo sin especificar todos los argumentos?

Respuesta

20

debe colocar los argumentos por defecto en el prototipo, no la definición de esta manera:

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

y hacer que la definición sin ellos:

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

Por cierto: en otra nota. Se considera buena práctica pasar objetos que sean más grandes que un int por const referencia. Si bien esto no es apropiado para todas las situaciones, es apropiado para la mayoría y evita copiar cosas innecesariamente. Por ejemplo:

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

func("hello world"); 
+0

Umm ... De alguna manera eso no funcionó. Recibo el error de "demasiados argumentos". – Xonara

+2

Si eso no funciona, entonces estás haciendo algo mal. No estoy seguro de qué podría causar ese problema, pero esta es la forma correcta de hacerlo. –

Cuestiones relacionadas