2016-05-03 7 views
-2

テンプレートを使用する可変関数を呼び出すマクロを作成しようとしています。 このコードはLoggerクラスの一部である私は、次のコードを使用しますが、リンカは、マクロの呼び出しを解決することはできません...マクロとテンプレートの可変関数

template< typename ... Args > 
void Logger::logTrace(Args const& ... args) 
{ 
    std::ostringstream stream; 
    using List = int[]; 
    (void)List{ 0, ((void)(stream << args), 0) ... }; 
    BOOST_LOG_SEV(log_, trace) << stream.str(); 
} 

ロガークラス:

class Logger { 

public: 
    static Logger* getInstance(const char *logFile = "LogClient.log"); 

    template< typename ... Args > 
    void logTrace(Args const& ... args); 

private: 
    Logger(std::string fileName); 
    virtual ~Logger(); 

    void initialize(std::string fileName); 

    static Logger* logger_; // singleton instance 
}; 

マクロ:

#define LOG_TRACE(...) Logger::getInstance()->logTrace(__VA_ARGS__); 

マクロへの呼び出し:

LOG_TRACE("A log with a number: %d", 5); 

ありがとうございました!

EDITし、解決:

問題は可変引数関数またはが、リンクでも、マクロに関連していませんでした。 クラス定義にlogTraceを実装すると、問題が解決されます。

コード作業:

`ロガークラス:

class Logger { 

public: 
    static Logger* getInstance(const char *logFile = "LogClient.log"); 

    template< typename ... Args > 
    void logTrace(Args const& ... args) 
    { 
     std::ostringstream stream; 
     using List = int[]; 
     (void)List{ 0, ((void)(stream << args), 0) ... }; 
     BOOST_LOG_SEV(log_, trace) << stream.str(); 
    } 

private: 
    Logger(std::string fileName); 
    virtual ~Logger(); 

    void initialize(std::string fileName); 

    static Logger* logger_; // singleton instance 
}; 

とマクロ:

#define LOG_TRACE(...) Logger::getInstance()->logTrace(__VA_ARGS__); 

マクロの呼び出し:

LOG_TRACE("A log with a number: %d", 5); 
+0

あなたは 'Logger'クラスの定義を示してもいいですか? – shrike

+0

投稿を更新しました – Kryx

+0

なぜ関数の代わりにマクロを使いたいのですか? – Holt

答えて

1

あなたが持つかもしれませんあなたのマクロと呼ばれるソースファイル内にLogger::logTrace()が宣言されていますが、定義されていない/実装されていません(例:Logger.hを含むソースファイル)。マクロを動作させるには、logTraceテンプレート関数の完全な定義が必要です。

私はあなたがLoggerクラスにlogTraceメンバ関数を定義勧め:

class Logger { 

public: 
    static Logger* getInstance(const char *logFile = "LogClient.log"); 

    template< typename ... Args > 
    void logTrace(Args const& ... args) 
    { /* add implementation here */ } 
    ... 
+0

ニース、うまくいきます!私は解決策でポストを編集します、たくさんありがとう – Kryx