Ich versuche emplace()
zu verwenden, um einen map<K,V>
Eintrag zu erstellen (mit Boost). Der Schlüsselobjektkonstruktor arg wird durch die Vorlagenmagie korrekt weitergeleitet, aber der V object
Konstruktor arg wird const, also funktioniert es nicht.Argument forwarding für emplace() macht Konstruktorargumente 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!
}
Der Fehler ist:
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))
Etwas über die emplace Argument Weiterleitung schaltet b
in const b
in der letzten Zeile. Ich weiß, dass es eine boost::bla_bla_bla
geben muss, die ich anwenden kann, damit es funktioniert, aber ich konnte es nicht finden.
Kann jemand helfen?
Compiler ist g ++ (Debian 4.9.2-10) 4.9.2, Boost Version 1.60.0 –
Es stellt sich heraus, ich brauchte ein zusätzliches Befehlszeilenargument, um diese Version von g ++ zu C++ - 11 zu bekommen. Einmal hinzugefügt, alles funktioniert! (g ++ -std = C++ 11 foo.cc) –