Digamos que tengo el siguiente código (muy simple).
#include <iostream>
int main() {
std::cout << std::stoi("12");
}
Esto compila bien tanto en g ++ como en clang; sin embargo, no se compila en MSVC con el siguiente error:
error C2039: 'stoi': no es miembro de 'std'
error C3861: 'stoi': identificador no encontrado
Sé que std::stoies parte del <string>encabezado, que presumiblemente los dos compiladores anteriores incluyen como parte <iostream>y el último no. De acuerdo con el estándar C ++ [res.on.headers]
Un encabezado de C ++ puede incluir otros encabezados de C ++.
Lo cual, para mí, básicamente dice que los tres compiladores son correctos.
Este problema surgió cuando uno de mis alumnos presentó trabajo, que el TA marcó como no compilado; Por supuesto, fui y lo arreglé. Sin embargo, me gustaría evitar futuros incidentes como este. Entonces, ¿hay alguna manera de determinar qué archivos de encabezado deben incluirse, a menos que se compile en tres compiladores diferentes para verificar cada vez?
La única forma en que puedo pensar es asegurar que para cada stdllamada a la función, exista una inclusión apropiada; pero si tiene un código existente que tiene miles de líneas, puede ser tedioso buscarlo. ¿Existe una forma más fácil / mejor de garantizar la compatibilidad entre compiladores?
Ejemplo con los tres compiladores: https://godbolt.org/z/kJhS6U
std::stoiinmediatamente se asegura de que #include <string>esté presente también.
std::stoies para manejar cadenas , podría adivinar que<string>sería un buen encabezado para incluir. O puede buscar una buena referencia que le dirá. Y le recomiendo que siempre incluya explícitamente los archivos de encabezado, para que no tenga que confiar en un comportamiento específico de implementación no portátil.