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 b
にb
になります。私はそれが動作するように私が適用できるboost::bla_bla_bla
がなければならないことを知っていますが、私はそれを見つけることができませんでした。
誰でも手伝いできますか?
コンパイラはg ++(Debian 4.9.2-10)4.9.2、ブーストバージョン1.60.0 –
です。このバージョンのg ++でC++ - 11を実行するには、追加のコマンドライン引数が必要でした。一度追加されると、すべてが機能します! (g ++ -std = C++ 11 foo.cc) –