奇妙な「候補者は1つの引数、0が提供される」コンストラクターに期待しています
-
28-10-2019 - |
質問
C ++でシンプルなスレッドサーバーアプリケーションを作成しています。これは、libconfig ++を使用して構成ファイルを解析します。まあ、LibConfigはマルチスレッドをサポートしていないため、「サポート」を達成するために2つのラッパークラスを使用しています。ポイントは、それらの1つが失敗することです:
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 *
!.
さて、いつものように、どんな助けも感謝します。
ジュリアン。
解決
デフォルトの構成をデフォルトで構成し、後で割り当てようとしています。ただし、デフォルトのコンストラクターはありません。
メンバー変数のコンストラクターに引数を渡す正しい方法は、次のとおりです。
app_main::app_main(int c, char **v) : argc(c), argv(v), config("mscs.cfg")
あなたはまだ例外をトラップすることができます。 関数TryBlock. 。見る 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;
}
他のヒント
まず第一に、Mutexesを動的に割り当てないでください。目的はありません。第二に、これは、デフォルト構築できないデータメンバーがあり、CTOR initリストで初期化しなかったためです。さらに、文字列リテラルを割り当てないでください char*
変数(そうあるべきです app_config(const char*)
あなたが本当に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;
}
所属していません StackOverflow