Const-Ärger mit Pool
-
Ich habe hier einen Code, der unter Linux einwandfrei compiliert, aber mit Visual Studio 2010 nicht:
boost::object_pool<Triangle> trianglePool; ...bla... Triangle* Mesh::createNewTriangle(Point_3* p0,Point_3* p1,Point_3* p2,Triangle* parent) { Triangle* ret=this->trianglePool.construct(p0,p1,p2); ...bla... }2>C:/windev/otherLib/boost_1_46_1\boost/pool/detail/pool_construct_simple.inc(39): error C2664: 'Triangle::Triangle(Point_3 *&,Point_3 *&,Point_3 *&)': Konvertierung des Parameters 1 von 'CGAL::Point_3<R_> ' in 'Point_3 *&' nicht möglich 2> with 2> [ 2> R_=CGAL::Epeck 2> ] 2> Durch die Konvertierung gehen Qualifizierer verloren 2> C:\windev\mergeLib\Mesh.cpp(369): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "Triangle *boost::object_pool<T>::construct<Point_3*,Point_3*,Point_3*>(const T0 &,const T1 &,const T2 &)". 2> with 2> [ 2> T=Triangle, 2> T0=Point_3 *, 2> T1=Point_3 *, 2> T2=Point_3 * 2> ]template <typename T0, typename T1, typename T2> element_type * construct(const T0 & a0, const T1 & a1, const T2 & a2) { element_type * const ret = (malloc)(); if (ret == 0) return ret; try { new (ret) element_type(a0, a1, a2); } catch (...) { (free)(ret); throw; } return ret; }Ich habe mich noch nicht an die Meldungen von Visual Studio gewöhnt, aber für
mein Verständnis bemängelt VS die Zeile try {new (ret) element_type(a0, a1,
a2);}", weil die die konstanten Pointer an einen Konstruktor gibt, der die
Pointer nicht konstant behandelt. Das sollte dann aber auch unter Linux
nicht gehen, und so ein Fehler in Boost ist doch sehr unwahrscheinlich. Kann
mir bitte jemand erklären, was es da genau hat?Danke, lg
-
Sieht so aus, als würde der Konstruktor von Triangle aus welchen Gründen auch immer die Pointer als nicht-konstante Referenz statt als Kopie nehmen.
constructwerden die aber alsconstübergeben, können also nicht an eine Referenz gebunden werden.Unter Linux geht es möglicherweise, weil da in
constructschon Perfect Forwarding benutzt.
-
ipsec schrieb:
Sieht so aus, als würde der Konstruktor von Triangle aus welchen Gründen auch immer die Pointer als nicht-konstante Referenz statt als Kopie nehmen.
constructwerden die aber alsconstübergeben, können also nicht an eine Referenz gebunden werden.Unter Linux geht es möglicherweise, weil da in
constructschon Perfect Forwarding benutzt.Stimmt, wenn man den Konstruktor des Triangle's ändert, geht es. Mich hat bloß
interessiert, warum Linux das durchgehen läßt.lg
-
Linux hat damit aber weniger zu tun - du meinst wohl den gcc (der aber auch unter Windows läuft
