Странный «кандидат ожидает 1 аргумент, 0 предоставлен» в конструкторе - PullRequest
5 голосов
/ 16 января 2012

Я делаю простое многопоточное серверное приложение на C ++, я использую libconfig ++ для разбора моих файлов конфигурации.Ну, libconfig не поддерживает многопоточность, поэтому я использую два класса-обертки для обеспечения "поддержки".Дело в том, что один из них завершается неудачно:

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;
};

Сбои ужасно при вызове из моего файла 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;
    }
}

И он говорит:

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)

Что странно, потому что я явно передаю аргумент, и, кроме того, это char *!.

Ну, как всегда, любая помощь будет оценена.

Джулиан.

Ответы [ 2 ]

10 голосов
/ 16 января 2012

Вы пытаетесь создать конфигурацию по умолчанию, а затем назначить ее позже.Но у вас нет конструктора по умолчанию.

Правильный способ передачи аргумента конструктору переменной-члена:

app_main::app_main(int c, char **v) : argc(c), argv(v), config("mscs.cfg")

Вы можете перехватить исключение, используятак называемый функция try-block .См. http://www.gotw.ca/gotw/066.htm

Финальный код:

app_main::app_main(int c, char **v)
try : argc(c), argv(v), config("mscs.cfg")
{
    // more constructor logic here
} 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;
}
4 голосов
/ 16 января 2012

Прежде всего, не выделяйте мьютексы динамически, это бесполезно.Во-вторых, это потому, что у вас есть элемент данных, который не может быть создан по умолчанию, и вы не инициализировали его в списке инициализации ctor.Кроме того, никогда не присваивайте строковые литералы переменным char* (это должно быть app_config(const char*), если вы действительно хотите баловаться с указателями на символы).

Вместо этого app_main::app_main должно выглядеть так:

app_main::app_main(int c, char **v) try
    : argc(c), argv(v), 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...