Estoy haciendo una aplicación de servidor simple en C++, es decir, utilizo libconfig ++ para analizar mis archivos de configuración. Bueno, libconfig no es compatible con multihilo, por lo que estoy usando dos clases de contenedor para lograr "soporte". El punto es, uno de ellos falla:Weird "candidato espera 1 argumento, 0 proporcionado" en el constructor
class app_config {
friend class app_config_lock;
public:
app_config(char *file) :
cfg(new libconfig::Config()),
mutex(new boost::mutex())
{
cfg->readFile(file);
}
private:
boost::shared_ptr<libconfig::Config> cfg;
boost::shared_ptr<boost::mutex> mutex;
};
falla terriblemente cuando se llama desde mi archivo main.cpp:
app_main::app_main(int c, char **v) : argc(c), argv(v) {
// here need code to parse arguments and pass configuration file!.
try {
config = app_config("mscs.cfg");
} catch (libconfig::ParseException &e) {
cout << "Parse error at line " << e.getLine() << ": " << e.getError() << endl;
throw;
} catch (libconfig::FileIOException &e) {
cout << "Configuration file not found." << endl;
throw;
}
}
y dice:
main.cpp: In constructor ‘app_main::app_main(int, char**)’:
main.cpp:38:54: error: no matching function for call to ‘app_config::app_config()’
main.cpp:38:54: note: candidates are:
../include/app_config.h:15:5: note: app_config::app_config(char*)
../include/app_config.h:15:5: note: candidate expects 1 argument, 0 provided
../include/app_config.h:12:7: note: app_config::app_config(const app_config&)
../include/app_config.h:12:7: note: candidate expects 1 argument, 0 provided
main.cpp:41:39: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings] (THIS CAN BE IGNORED, I WAS USING STD::STRING, YET CHANGED IT FOR TESTING PURPOSES)
lo cual es raro porque yo m claramente pasando una discusión, y además es un char *
!
Bueno, como siempre, cualquier ayuda será apreciada.
Julian.
Esto resolvió el problema. Sin embargo, planeo pasar una cadena variable, en lugar de una cadena estática, ¿hay alguna manera de que realmente pueda procesar mis variables argc y argv dentro de mi miembro app_main e inicializar la configuración después de eso, en lugar de en la lista de inicialización? –
@JulianBayardoSpadafora: No. Puede pasar los argumentos del constructor a los constructores miembros, no solo las constantes en tiempo de compilación. Y también puede llamar a las funciones estáticas de los miembros dentro de * ctor-initializer-list *. Finalmente, usted tiene control sobre el orden en que se construyen los miembros. Pero probablemente deba hacer un procesamiento de argumentos antes de esto, y pasar algún tipo de objeto paquete de opción con un 'getConfigFilename()' o dicha función de miembro. O simplemente dele a 'app_config' una función para leer el archivo en lugar de hacerlo desde el constructor. –