2016-04-01 9 views
0

map<K,V>エントリを(ブーストを使用して)インプレースで構築するためにemplace()を使用しようとしています。キーオブジェクトコンストラクタargはテンプレートマジックを通して正しく転送されますが、V objectコンストラクタargはconstになりますので動作しません。emplace()の引数転送はコンストラクタ引数をconstにします

#include <boost/container/map.hpp> 

class A { 
    public: 
    /**/  A(int n) { } 
    friend bool operator<(const A &a1, const A &a2) { return false; } 
} ; 

class B { 
    public: 
    /**/  B(const char *str) { } 
} ; 

class C { 
    public: 
    /**/  C(B &b) { } 
} ; 

int 
main(int, char **) 
{ 
    boost::container::map<A,B> m1; 
    boost::container::map<A,C> m2; 
    B       b("Foo"); 
    C       c(b); // <--- this works OK. 

    m1.emplace(1, "Hello"); 
    m2.emplace(2, b); // <----- this fails! 
} 

エラーは次のとおりです。据え付ける引数転送について

Error: /usr/local/include/boost/container/detail/pair.hpp:128:38: error: no matching function for call to C::C(const B&), second(::boost::forward<V>(v)) 

何かが最後の行にconst bbになります。私はそれが動作するように私が適用できるboost::bla_bla_blaがなければならないことを知っていますが、私はそれを見つけることができませんでした。

誰でも手伝いできますか?

+0

コンパイラはg ++(Debian 4.9.2-10)4.9.2、ブーストバージョン1.60.0 –

+1

です。このバージョンのg ++​​でC++ - 11を実行するには、追加のコマンドライン引数が必要でした。一度追加されると、すべてが機能します! (g ++ -std = C++ 11 foo.cc) –

答えて

1

-std=c++11(またはそれ以降)を使用してこれをコンパイルすると、これが機能することに注意してください。なぜこれが掘り起こされたのか - 少し古いバージョンのブースト(1.56)を使用していますが、これは2つのリリースで大きく変わったのではないかと思います。

emplaceを使用すると、一般的に完全な転送が必要です。これは、すべての引数がstd::forward<Args>(args)...経由で転送されることを意味します。下には、参照の折りたたみと移動のセマンティクスがあります。これはすべてC++ 11の領域であり、C++ 03ではアナログがありません。

template<class U, class V> 
pair(BOOST_FWD_REF(U) u, BOOST_FWD_REF(V) v) 
    : first(::boost::forward<U>(u)) 
    , second(::boost::forward<V>(v)) 
{} 

残念ながら、(move/core.hppである)BOOST_FWD_REFが1:我々は(それが実際にエラーが発生です)pair用ブーストコードに掘る場合

、これはそれが呼び出そうとしていますコンストラクタがありますあなたのコンパイラは右辺値参照を認識しない場合は

#define BOOST_FWD_REF(TYPE)\ 
    const TYPE & \ 
// 

#define BOOST_FWD_REF(TYPE)\ 
    const TYPE & \ 
// 

、これはその後const TYPE&になります。次の

これについての議論が少しあります。on the boost archives list

もっとも簡単な解決策は、std=c++11で簡単にコンパイルすることです。

+0

ありがとう!私はC++ 11の部分を見つけ出し、読書の中で価値のある参照を見つけましたが、周囲の情報を十分に理解していないので、包括的な答えにまとめることができました。 –

関連する問題