当我尝试为地图分配值时,我正在尝试创建类型为map<int,CGAL::AABB_tree<Traits>>
的STL地图(AABB tree's的地图)(此代码仅用于演示目的):
//CGAL includes begin
#include <CGAL/Simple_cartesian.h>
#include <CGAL/Polyhedron_incremental_builder_3.h>
#include <CGAL/AABB_tree.h>
#include <CGAL/AABB_traits.h>
#include <CGAL/Polyhedron_3.h>
#include <CGAL/AABB_face_graph_triangle_primitive.h>
//CGAL includes end
/*
* CGAL typedef's for initialization
*/
typedef CGAL::Simple_cartesian<double> K;
typedef K::FT FT;
typedef K::Point_3 Point_3;
typedef K::Segment_3 Segment;
typedef CGAL::Polyhedron_3<K> Polyhedron;
typedef Polyhedron::HalfedgeDS HalfedgeDS;
typedef Polyhedron::Vertex_const_iterator Vertex_const_iterator;
typedef Polyhedron::Facet_const_iterator Facet_const_iterator;
typedef Polyhedron::Halfedge_around_facet_const_circulator Halfedge_around_facet_const_circulator;
typedef CGAL::AABB_face_graph_triangle_primitive<Polyhedron> Primitive;
typedef CGAL::AABB_traits<K, Primitive> Traits;
typedef CGAL::AABB_tree<Traits> Tree;
typedef Tree::Point_and_primitive_id Point_and_primitive_id;
//end of typedef's
BuildMesh<HalfedgeDS> mesh(V, F);
polyhedron.delegate( mesh);
myMap[someInt] = Tree(polyhedron.facets_begin(),polyhedron.facets_end(),polyhedron);
我收到以下错误:
错误C2248:&#39; CGAL :: AABB_tree&lt; AABBTraits&gt; :: operator =&#39; :不能 访问类&#39; CGAL :: AABB_tree&lt;中声明的私有成员AABBTraits&GT;&#39;
我尝试查看CGAL的源代码,并在CGAL \ AABB_tree.h中找到以下行:
private:
// Disabled copy constructor & assignment operator
typedef AABB_tree<AABBTraits> Self;
AABB_tree(const Self& src);
Self& operator=(const Self& src);
这意味着复制和赋值构造函数是私有的,因此无法创建 stl类型为Tree的容器。
我尝试使用指针而不是将地图更改为map<int,CGAL::AABB_tree < Traits > * >
并试过:
BuildMesh<HalfedgeDS> mesh(V, F);
polyhedron.delegate( mesh);
myMap[someInt] = new Tree(polyhedron.facets_begin(),polyhedron.facets_end(),polyhedron);
然后它崩溃了我的代码。
有什么方法可以创建这种类型的STL容器吗?
更新14/3/2014
我尝试使用Drop的解决方案,但我收到以下错误:
错误C2248:&#39; CGAL :: AABB_tree :: AABB_tree&#39; :无法访问 在课堂上宣布的私人成员&#39; CGAL :: AABB_tree&#39;
更新2014年3月17日
以下是一个不编译的示例代码:
#include <iostream>
#include <map>
#include <CGAL/Simple_cartesian.h>
#include <CGAL/AABB_tree.h>
#include <CGAL/AABB_traits.h>
#include <CGAL/Polyhedron_3.h>
#include <CGAL/AABB_face_graph_triangle_primitive.h>
using std::map;
typedef CGAL::Simple_cartesian<double> K;
typedef K::FT FT;
typedef K::Point_3 Point;
typedef K::Segment_3 Segment;
typedef CGAL::Polyhedron_3<K> Polyhedron;
typedef CGAL::AABB_face_graph_triangle_primitive<Polyhedron> Primitive;
typedef CGAL::AABB_traits<K, Primitive> Traits;
typedef CGAL::AABB_tree<Traits> Tree;
typedef Tree::Point_and_primitive_id Point_and_primitive_id;
int main()
{
map<int,Tree> myMap;
Point p(1.0, 0.0, 0.0);
Point q(0.0, 1.0, 0.0);
Point r(0.0, 0.0, 1.0);
Point s(0.0, 0.0, 0.0);
Polyhedron polyhedron;
polyhedron.make_tetrahedron(p, q, r, s);
// here i get the error
myMap.emplace(
std::piecewise_construct,
std::forward_as_tuple(1),
std::forward_as_tuple(polyhedron.facets_begin(), polyhedron.facets_end(),polyhedron));
myMap[1].accelerate_distance_queries();
// query point
Point query(0.0, 0.0, 3.0);
// computes squared distance from query
FT sqd = myMap[1].squared_distance(query);
std::cout << "squared distance: " << sqd << std::endl;
// computes closest point
Point closest = myMap[1].closest_point(query);
std::cout << "closest point: " << closest << std::endl;
// computes closest point and primitive id
Point_and_primitive_id pp = myMap[1].closest_point_and_primitive(query);
Point closest_point = pp.first;
Polyhedron::Face_handle f = pp.second; // closest primitive id
std::cout << "closest point: " << closest_point << std::endl;
std::cout << "closest triangle: ( "
<< f->halfedge()->vertex()->point() << " , "
<< f->halfedge()->next()->vertex()->point() << " , "
<< f->halfedge()->next()->next()->vertex()->point()
<< " )" << std::endl;
return EXIT_SUCCESS;
}
有什么想法吗?
答案 0 :(得分:2)
使用std::map::emplace()
method, std::pair's piecewise constructor和perfect forwarding来就地构建不可复制和不可分配的数据:
myMap.emplace(
std::piecewise_construct, // disambiguation hint
std::forward_as_tuple(someInt), // perfectly forward arguments to key_type constructor
std::forward_as_tuple(polyhedron.facets_begin(), polyhedron.facets_end(),
polyhedron)); // perfectly forward arguments to value_type constructor
解决方案非常详细,但完全符合C ++ 11标准。
工作示例:Coliru Viewer
修改强>
如果编译器不支持std::make_tuple
,请使用std::forward_as_tuple
代替#include <tuple>
。
编辑2:
在审核了已添加的代码后,我发现错误是由map::emplace
方法触发的(可以通过注释来轻松验证),但后来使用了map::operator[]
。在内部,map::operator[]
使用map::insert
(查看它的源代码)。只需使用map::at()
来解决问题。例如:
FT sqd = myMap.at(1).squared_distance(query);
注意,如果找不到密钥,则map::at()
会抛出异常。您可能会感兴趣(取决于性能要求),在访问值之前通过map::find()
检查来确保密钥。
另请注意,由于CGAL内部使用“不安全”字符串函数,您将收到详细警告。它们不是错误,可以通过添加-D_SCL_SECURE_NO_WARNINGS
编译器标志来禁用。
希望它有所帮助。快乐的编码!