奇怪的“候选人希望在构造函数中提供1个参数,0提供”

时间:2012-01-16 05:02:15

标签: c++ exception-handling construction member-variables function-try-block

我在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 个答案:

答案 0 :(得分:10)

您正在尝试默认构建您的配置,然后再分配给它。但是你没有默认的构造函数。

将参数传递给成员变量的构造函数的正确方法是:

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

答案 1 :(得分:4)

首先,不要动态分配互斥锁,它没有用处。其次,这是因为你有一个不能默认构造的数据成员,并且你没有在ctor init列表中初始化它。另外,永远不要将字符串文字分配给char*个变量(如果你真的想要使用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;
}