lundi 25 avril 2016

Initialize a tuple of vectors in a class member initializer list

I have a data structure:

using Delaunay = CGAL::Delaunay_triangulation_3<K, Tds>;
using Cell_handle = Delaunay::Cell_handle;
using Vertex_handle = Delaunay::Vertex_handle;
using Edge_handle = std::tuple<Cell_handle, std::uintmax_t, std::uintmax_t>;
using geometry_tuple = std::tuple<std::vector<Cell_handle>,
                              std::vector<Cell_handle>,
                              std::vector<Cell_handle>,
                              std::vector<Edge_handle>,
                              std::uintmax_t,
                              std::vector<Vertex_handle>>;

That I would like to initialize in a default constructor:

struct SimplicialManifold {
///  Default constructor with proper initialization
SimplicialManifold()
      : triangulation{std::make_unique<Delaunay>()},
        geometry{std::make_tuple(0, 0, 0, 0, 0, 0)} {}

std::unique_ptr<Delaunay> triangulation;
///< std::unique_ptr to the Delaunay triangulation

geometry_tuple geometry;
///< The geometric structure of the triangulation
};

The above code works in Apple LLVM version 7.3.0 (clang-703.0.29), but fails in GCC 5.2 with a ton of template compiler goo:

../src/S3Triangulation.h: In constructor ‘SimplicialManifold::SimplicialManifold()’../src/S3Triangulation.h:493:55: error: no matching function for call to
 ‘std::tuple<std::vector<CGAL::CCC_internal::CCC_iterator<CGAL::Concurrent_compact_container<CGAL::Triangulation_cell_base_with_info_3<long unsigned int, CGAL::Epick, CGAL::Triangulation_cell_base_3<CGAL::Epick, CGAL::Triangulation_ds_cell_base_3<CGAL::Triangulation_data_structure_3<CGAL::Triangulation_vertex_base_with_info_3<long unsigned int, CGAL::Epick, CGAL::Triangulation_vertex_base_3<CGAL::Epick, CGAL::Triangulation_ds_vertex_base_3<void> > >, CGAL::Triangulation_cell_base_with_info_3<long unsigned int, CGAL::Epick, CGAL::Triangulation_cell_base_3<CGAL::Epick, CGAL::Triangulation_ds_cell_base_3<void> > >, CGAL::Parallel_tag> > > >, tbb::scalable_allocator<CGAL::Triangulation_cell_base_with_info_3<long unsigned int, CGAL::Epick, CGAL::Triangulation_cell_base_3<CGAL::Epick, CGAL::Triangulation_ds_cell_base_3<CGAL::Triangulation_data_structure_3<CGAL::Triangulation_vertex_base_with_info_3<long unsigned int, CGAL::Epick, CGAL::Triangulation_vertex_base_3<CGAL::Epick, CGAL::Triangulation_ds_vertex_base_3<void> > >, CGAL::Triangulation_cell_base_with_info_3<long unsigned int, CGAL::Epick, CGAL::Triangulation_cell_base_3<CGAL::Epick, CGAL::Triangulation_ds_cell_base_3<void> > >, CGAL::Parallel_tag> > > > > >, false>, std::allocator<CGAL::CCC_internal::CCC_iterator<CGAL::Concurrent_compact_container<CGAL::Triangulation_cell_base_with_info_3<long unsigned int, CGAL::Epick, CGAL::Triangulation_cell_base_3<CGAL::Epick,

(The code in question is http://ift.tt/1XTPkzk starting on line 467.)

I looked at initializer lists, but those don't work:

geometry{std::initializer_list<std::vector<Cell_handle>,
                std::vector<Cell_handle>,
                std::vector<Cell_handle>,
                std::vector<Edge_handle>,
                std::uintmax_t,
                std::vector<Vertex_handle>>({0, 0, 0, 0, 0, 0})
        } {}

Suggestions on how to do this and make GCC happy?

Aucun commentaire:

Enregistrer un commentaire