2012-01-16 9 views
6

Me encanta la forma en que Xcode ofrece una idea de las posibles funciones de miembros disponibles del idioma y preferiría usarla en relación con, digamos, mate de texto, si no fuera por una rareza que noté hoy.Desarrollo de Xcode C++, se necesita aclaración

Cuando string s = "Test string"; la única disponible substr firma es como se muestra

enter image description here

Por lo que entiendo, sin embargo, y lo que i see online la firma debe ser

string substr (size_t pos = 0, size_t n = npos) const; 

De hecho s.substr(1,2); se entiende y funciona en Xcode.

¿Por qué no se muestra cuando intento completar el método? (Ctrl-Space)

+0

Estoy bastante seguro de que lo mejor que puede hacer en este momento es presentar un informe de error. – zneak

Respuesta

15

Xcode está realizando la finalización correctamente, pero no es lo que espera. En realidad, tú mismo has respondido la pregunta sin saberlo. La firma de la función de string 's substr() método, al igual que usted ha dicho, es la siguiente:

string substr (size_t pos = 0, size_t n = npos) const; 

Todos los argumentos a substr() tienen asignaciones por defecto, por lo tanto, a Xcode, s.substr() (sin argumentos) es la finalización de código válida para insertar porque es realmentes.substr(0, s.npos). Puede confirmar esto con cualquier cantidad de funciones estándar de C++ con argumentos predeterminados. El lugar más fácil para ver esto es con cualquier constructor de contenedor STL.

Tome por ejemplo un vector. Todos sabemos que vectors puede tomar un Allocator, pero el argumento predeterminado asignado Allocator es "lo suficientemente bueno" para la mayoría de los usos casuales. Efectivamente, dos de las firmas para vector constructores son:

explicit vector (const Allocator& = Allocator()); 
explicit vector (size_type n, const T& value= T(), const Allocator& = Allocator()); 

En ambos casos, el argumento Allocator tiene una asignación predeterminada, y en el segundo, el valor por defecto T tiene una asignación predeterminada. Ahora, echar un vistazo a lo que sugiere Xcode cuando se construye un vector:

Xcode 4.2.1 Code Completions for vector constructor

La sugerencia sin lista de argumentos es en realidad el constructor que toma sólo un Allocator. La sugerencia que toma solo size_type es en realidad el constructor que toma size_type, T y Allocator.

Dependiendo de cómo piense sobre esto, puede o no ser un error de Xcode. Idealmente, desea ver terminaciones con argumentos predeterminados para funciones más simples como substr(), pero para los constructores de contenedor STL, probablemente casi nunca desea verlos. Tal vez podría ser una opción, pero no esperaría ver esto corregido. Sin embargo, afortunadamente duplicaría un radar contigo.

+1

+1 para una excelente explicación. –

+0

Así que es otro error en Xcode. – Florian

+0

Error o característica dependiendo del comportamiento que prefiera. –

Cuestiones relacionadas