1. ホーム
  2. c

コンパイラーエラー: '(' トークンの前に一次式があることが予想されます。

2022-02-27 21:12:30

コンパイル時に、以下のようなエラー文が表示されます。LOG(INFO) << "ユーザーID:" << org.user_id ;

エラーの報告

 error: '('トークンの前に一次式があることが予想されます。

 error: numeric constant の前に unqualified-id があるはずです。

しかし、何度検索してもエラーが出ないので、マクロ定義のINFOが他のヘッダー関数のINFOと衝突して、このエラーが発生することがわかりました。

しかし、このヘッダー関数が必要なもので、魚と熊の前足の両方を手に入れるにはどうしたらいいのでしょう。参考までに、とても賢いラッピングのテクニックを紹介しよう。

LOG(INFO)のヘッダー関数は次の通りです:logging.h

競合するヘッダー関数は:dbclient.h(競合がどのようなものであるかは、今は無視します)

カスタムインターフェイスとしてmy_dbclient.h my_dbclient.cppを新規に作成し、以下のように実装します。

my_dbclient.h

<pre name="code" class="cpp">#include <iostream>
#include <vector>
#include <map>
//Note: dbclient.h is not included here, otherwise it would be wrapped in vain.
//define DBClientConnection, Query, avoid undefine errors
namespace mongo {
class DBClientConnection;
class Query;
namespace mongo { class DBClientConnection; class Query; }

class my_dbclient{
private:
    mongo::DBClientConnection * m_newsdb_conn;
    
public:
    my_dbclient();
    ~my_dbclient();
private:
    bool QueryNewsDB( mongo::Query condition, std::vector<SimpleNewsInfo>&news_vec );



my_dbclient.cpp

<pre name="code" class="cpp">#include "my_dbclient.h"
#include "dbclient.h"// here then include dbclient.h so that other functions include "my_dbclient.h" will not include dbclient.h
using namespace std;
using namespace mongo;

my_dbclient::my_dbclient()
{ }
my_dbclient::~my_dbclient()
{ }



このように、dbclientライブラリの機能を利用しつつ、logging.hを呼び出すことが可能です。