2016-03-27 13 views
1

私は、プロジェクトにboost.logを設定しようとしています。私は例を追ってきましたが、フォーマットを設定しようとすると、コンパイラはそのフォーマットは読み取り専用の参照であると言います。コンソールログの形式をBoost.Logに設定できません。

void init() { 
    logging::add_console_log(
     std::cout, 

     // Compiler says "const boost::parameter::keyword<keywords::tag::format>& is read-only reference". 
     keywords::format = "%Timestamp% %Message%", 

     keywords::severity = info 
    ); 

    logging::add_common_attributes(); 
} 
+1

盲目的にBoostコードを書いてみる前に、言語自体について学ぶべきです。このようにして、ある日か何度か、1000行の長いテンプレートのインスタンス化エラーの前に自分自身があり、何をすべきか分からないでしょう。 – 3442

+0

これはどのタイプのエラーであるのかを私にピンポイントで伝えることができます。私はソフトウェア開発の初心者ではありません(私は建築家です)、私はほとんどの原則をほとんど理解しています。軽量のGlusterFSの代わりにC++を学ぶ必要があります。これがどんな種類のエラーであるか教えてください。 – sturcotte06

+0

私はBoostの専門家ではありませんが、コンパイラが適切に指示するように、読み取り専用の変数を変更しようとしていることがわかりました。それは基本的にあなたの質問に対する答えです。 – 3442

答えて

1

私は、あなたがコンパイラのバグを経験していると思います。 formatキーワードは、BOOST_PARAMETER_KEYWORDであるBoost.Parameterで宣言された他のキーワードと同様に、確かに定数参照です。ただし、const-qualified代入演算子はboost::parameter::keywordであり、コンパイラが選択する必要があります。

回避策として、あなたはこのようget静的関数の呼び出しとキーワードを交換してくださいすることができます

また
// Replace this: 
keywords::format = "%Timestamp% %Message%" 

// with this: 
boost::parameter::keyword<keywords::tag::format>::get() = "%Timestamp% %Message%" 

は、属性名は大文字と小文字が区別されていることに注意してください、とadd_common_attributes機能が追加されます "タイムスタンプ "属性ではなく、"タイムスタンプ "属性である(大文字のSに注意)。

+0

答えをいただきありがとうございます。しかし、コンパイラは依然としてインスタンスの不変性について不平を言っています。 – sturcotte06

+0

キーワードを作成するだけではどうですか? 'boost :: parameter :: keyword フォーマット; format = "%Timestamp%%Message%"; '何も問題がなければ、シンクを手動で構築してAPIを使って設定することができます(http://www.boost.org/doc/libs/1_60_0/を参照)。 libs/log/doc/html/boost/log/sinks/text_file_backend.html)、ライブラリの他の部分でも同様のエラーが発生する可能性があります。また、どのコンパイラを使用していますか? –

+0

ところで、それはうまくいきますが、CLionはラインにエラーとしてフラグを立てています。しかし、gcc(-Wall -Wextra -Werror)からの警告なしに、コードはコンパイルされて動作します。私は調査を中止し、それをそのまま放置することにしました。(CLionは多くのブーストコードを掲げています) – sturcotte06

関連する問題