に別のメソッドに引数の変数num個を渡すコードとそれが動作:私は(例えば、目的のために簡略化)以下の持っているクラス
void log(const string type, const string msg, va_list argp)
{
fprintf(stdout, "[%s] ", type.c_str());
vfprintf(stdout, msg.c_str(), argp);
}
void log_err(const string msg, ...)
{
va_list argp;
va_start(argp, msg);
log("ERROR", msg, argp);
va_end(argp);
}
私はこの方法でそれを使用します。
log_err("test: %d", 5);
私はクラスにこれを移動したい場合
しかし:
class Logger {
public:
Logger() {
//
};
void generic(const string type, const string msg, va_list argp) {
fprintf(stdout, "[%s] ", type.c_str());
vfprintf(stdout, msg.c_str(), argp);
};
void error(const string msg, ...) {
va_list argp;
va_start(argp, msg);
this->generic("ERROR", msg, argp);
va_end(argp);
};
};
それから私は、セグメンテーションフォールトを得ました。マクロのようなトリッキーなことはクラススコープ内ではうまくいかないことが分かっていますが、その理由を知りたいのです。
アドバイスありがとうございます!
EDIT
使用例:
Logger logger;
logger.error("test", 5);
完全なソース:私は、元の使用中に、私はプライベートファイルディスクリプタを持っているので、これらのメソッドは、静的したくない
#include <string>
#include <cstdlib>
#include <cstdarg>
using namespace std;
void log(const string type, const string msg, va_list argp)
{
fprintf(stdout, "[%s] ", type.c_str());
vfprintf(stdout, msg.c_str(), argp);
}
void log_err(const string msg, ...)
{
va_list argp;
va_start(argp, msg);
log("ERROR", msg, argp);
va_end(argp);
}
class Logger {
public:
Logger() {
//
};
void generic(const string type, const string msg, va_list argp) {
fprintf(stdout, "[%s] ", type.c_str());
vfprintf(stdout, msg.c_str(), argp);
};
void error(const string msg, ...) {
va_list argp;
va_start(argp, msg);
this->generic("ERROR", msg, argp);
va_end(argp);
};
};
int main()
{
//log_err("test: %s\n", "str");
Logger logger;
logger.error("test %s", 5);
return 0;
}
私はログメッセージを書いています。
はまだ可変長引数テンプレートを得ましたか。 – sehe
貼り付けたコードは上手く見えます。セグメンテーションフォルトはどこで発生しますか? 'エラー'の呼び出しはどうなるでしょうか? (そして、 'this->'を取り除く必要はありません) –
実際に 'error()'をどう呼びますか?クラスとvarargsに関する '面倒なこと'は、可変引数リストに非PODオブジェクトを渡すことができないということです。 –