From afe855652be55925ce5a7983f39560a4a19f8a75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 20 May 2013 14:51:11 +0200 Subject: [PATCH 1/7] bug-fix: update the SNC_io_parser to keep on working with Epeck --- Nef_3/include/CGAL/Nef_3/SNC_io_parser.h | 146 ++++++++++++----------- 1 file changed, 74 insertions(+), 72 deletions(-) diff --git a/Nef_3/include/CGAL/Nef_3/SNC_io_parser.h b/Nef_3/include/CGAL/Nef_3/SNC_io_parser.h index d1a0659e55a..0b15ce02421 100644 --- a/Nef_3/include/CGAL/Nef_3/SNC_io_parser.h +++ b/Nef_3/include/CGAL/Nef_3/SNC_io_parser.h @@ -597,78 +597,6 @@ class Homogeneous_tag; class Cartesian_tag; template class Geometry_io; -template -class Geometry_io > > { - public: - template static - typename EK::Point_3 - read_point(std::istream& in) { - typedef Fraction_traits FracTraits; - typename FracTraits::Type hx, hy, hz, hw; - typename FracTraits::Numerator_type num; - typename FracTraits::Denominator_type denom(1); - typename FracTraits::Compose composer; - in >> num; - hx = composer(num, denom); - in >> num; - hy = composer(num, denom); - in >> num; - hz = composer(num, denom); - in >> num; - hw = composer(num, denom); - return typename EK::Point_3(hx,hy,hz,hw); - } - - template static - typename EK::Plane_3 read_plane(std::istream& in) { - typedef Fraction_traits FracTraits; - typename FracTraits::Type a, b, c, d; - typename FracTraits::Numerator_type num; - typename FracTraits::Denominator_type denom(1); - typename FracTraits::Compose composer; - in >> num; - a = composer(num, denom); - in >> num; - b = composer(num, denom); - in >> num; - c = composer(num, denom); - in >> num; - d = composer(num, denom); - return typename EK::Plane_3(a,b,c,d); - } - - template static - void print_point(std::ostream& out, const CGAL::Point_3 p) { - typedef typename CGAL::Simple_cartesian SC; - typedef typename SC::Point_3 Exact_point; - typedef Geometry_io Gio; - - Exact_point ep(p.x().exact(), p.y().exact(), p.z().exact()); - Gio::print_point(out, ep); - } - - template static - void print_vector(std::ostream& out, const CGAL::Vector_3 vec) { - typedef typename CGAL::Simple_cartesian SC; - typedef typename SC::Vector_3 Exact_vector; - typedef Geometry_io Gio; - - Exact_vector ev(vec.x().exact(), vec.y().exact(), vec.z().exact()); - Gio::print_vector(out, ev); - } - - template static - void print_plane(std::ostream& out, const CGAL::Plane_3 p) { - typedef typename CGAL::Simple_cartesian SC; - typedef typename SC::Plane_3 Exact_plane; - typedef Geometry_io Gio; - - Exact_plane ep(p.a().exact(), p.b().exact(), - p.c().exact(), p.d().exact()); - Gio::print_plane(out, ep); - } -}; - template class Geometry_io { public: @@ -806,6 +734,80 @@ class Geometry_io { } }; +class Epeck; + +template<> +class Geometry_io { + public: + template static + typename EK::Point_3 + read_point(std::istream& in) { + typedef Fraction_traits FracTraits; + typename FracTraits::Type hx, hy, hz, hw; + typename FracTraits::Numerator_type num; + typename FracTraits::Denominator_type denom(1); + typename FracTraits::Compose composer; + in >> num; + hx = composer(num, denom); + in >> num; + hy = composer(num, denom); + in >> num; + hz = composer(num, denom); + in >> num; + hw = composer(num, denom); + return typename EK::Point_3(hx,hy,hz,hw); + } + + template static + typename EK::Plane_3 read_plane(std::istream& in) { + typedef Fraction_traits FracTraits; + typename FracTraits::Type a, b, c, d; + typename FracTraits::Numerator_type num; + typename FracTraits::Denominator_type denom(1); + typename FracTraits::Compose composer; + in >> num; + a = composer(num, denom); + in >> num; + b = composer(num, denom); + in >> num; + c = composer(num, denom); + in >> num; + d = composer(num, denom); + return typename EK::Plane_3(a,b,c,d); + } + + template static + void print_point(std::ostream& out, const CGAL::Point_3 p) { + typedef typename Epeck::Exact_kernel SC; + typedef typename SC::Point_3 Exact_point; + typedef Geometry_io Gio; + + Exact_point ep(p.x().exact(), p.y().exact(), p.z().exact()); + Gio::print_point(out, ep); + } + + template static + void print_vector(std::ostream& out, const CGAL::Vector_3 vec) { + typedef typename Epeck::Exact_kernel SC; + typedef typename SC::Vector_3 Exact_vector; + typedef Geometry_io Gio; + + Exact_vector ev(vec.x().exact(), vec.y().exact(), vec.z().exact()); + Gio::print_vector(out, ev); + } + + template static + void print_plane(std::ostream& out, const CGAL::Plane_3 p) { + typedef typename Epeck::Exact_kernel SC; + typedef typename SC::Plane_3 Exact_plane; + typedef Geometry_io Gio; + + Exact_plane ep(p.a().exact(), p.b().exact(), + p.c().exact(), p.d().exact()); + Gio::print_plane(out, ep); + } +}; + template class Geometry_io { public: From 273a1805b2c7644be146e299e1f8c9c3bb543bd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 20 May 2013 16:09:03 +0200 Subject: [PATCH 2/7] add a test to ensure io are valid --- Nef_3/test/Nef_3/test_nef_3_io.cpp | 66 ++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 Nef_3/test/Nef_3/test_nef_3_io.cpp diff --git a/Nef_3/test/Nef_3/test_nef_3_io.cpp b/Nef_3/test/Nef_3/test_nef_3_io.cpp new file mode 100644 index 00000000000..ee4c3cae266 --- /dev/null +++ b/Nef_3/test/Nef_3/test_nef_3_io.cpp @@ -0,0 +1,66 @@ +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +typedef CGAL::Exact_predicates_exact_constructions_kernel EPEC; +typedef CGAL::internal::Exact_type_selector::Type FT; +typedef CGAL::Fraction_traits::Numerator_type RT; +typedef CGAL::Lazy_exact_nt < FT > Lazy_FT; +typedef CGAL::Lazy_exact_nt < RT > Lazy_RT; +typedef CGAL::Cartesian< Lazy_FT > C_Lazy_FT; +typedef CGAL::Simple_cartesian< Lazy_FT > SC_Lazy_FT; +typedef CGAL::Homogeneous< Lazy_RT > H_Lazy_RT; +typedef CGAL::Simple_homogeneous< Lazy_RT > SH_Lazy_RT; + + +template +void test_write_read() +{ + typedef CGAL::Nef_polyhedron_3< Kernel > Nef_polyhedron; + typedef CGAL::Polyhedron_3< Kernel > Polyhedron; + typedef typename Kernel::Point_3 Point; + + Point p(sqrt(2), 0, 0); + Point q( 0,sqrt(2), 0); + Point r( 0, 0,sqrt(2)); + Point s( 0, 0, 0); + + Polyhedron P; + P.make_tetrahedron( p, q, r, s); + Nef_polyhedron nef_1( P ); + + std::ofstream out ("temp.nef"); + out << nef_1; + out.close(); + + std::ifstream in ("temp.nef"); + Nef_polyhedron nef_2; + in >> nef_2; + + assert( nef_1 == nef_2); +} + +int main() +{ + std::cout << "Testing Exact_predicates_exact_constructions_kernel\n"; + test_write_read(); + std::cout << "Testing Cartesian< Lazy_exact_nt >\n"; + test_write_read(); + std::cout << "Testing Simple_cartesian< Lazy_exact_nt >\n"; + test_write_read(); + std::cout << "Testing Homogeneous< Lazy_exact_nt >\n"; + test_write_read(); + std::cout << "Testing Simple_homogeneous< Lazy_exact_nt >\n"; + test_write_read(); + + return 0; +} From 85d414d464015e199e38d182b74aebef2c2a0152 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 20 May 2013 16:15:49 +0200 Subject: [PATCH 3/7] test more kernels --- Nef_3/test/Nef_3/test_nef_3_io.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Nef_3/test/Nef_3/test_nef_3_io.cpp b/Nef_3/test/Nef_3/test_nef_3_io.cpp index ee4c3cae266..f47a158d698 100644 --- a/Nef_3/test/Nef_3/test_nef_3_io.cpp +++ b/Nef_3/test/Nef_3/test_nef_3_io.cpp @@ -16,6 +16,10 @@ typedef CGAL::internal::Exact_type_selector::Type FT; typedef CGAL::Fraction_traits::Numerator_type RT; typedef CGAL::Lazy_exact_nt < FT > Lazy_FT; typedef CGAL::Lazy_exact_nt < RT > Lazy_RT; +typedef CGAL::Cartesian< FT > C_FT; +typedef CGAL::Simple_cartesian< FT > SC_FT; +typedef CGAL::Homogeneous< RT > H_RT; +typedef CGAL::Simple_homogeneous< RT > SH_RT; typedef CGAL::Cartesian< Lazy_FT > C_Lazy_FT; typedef CGAL::Simple_cartesian< Lazy_FT > SC_Lazy_FT; typedef CGAL::Homogeneous< Lazy_RT > H_Lazy_RT; @@ -54,6 +58,14 @@ int main() std::cout << "Testing Exact_predicates_exact_constructions_kernel\n"; test_write_read(); std::cout << "Testing Cartesian< Lazy_exact_nt >\n"; + test_write_read(); + std::cout << "Testing Simple_cartesian< FT >\n"; + test_write_read(); + std::cout << "Testing Homogeneous< RT >\n"; + test_write_read(); + std::cout << "Testing Simple_homogeneous< RT >\n"; + test_write_read(); + std::cout << "Testing Cartesian< FT >\n"; test_write_read(); std::cout << "Testing Simple_cartesian< Lazy_exact_nt >\n"; test_write_read(); From 51103a281f201775561dbf44369f70be012f1257 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 21 May 2013 08:36:05 +0200 Subject: [PATCH 4/7] fix SNC_IO_parser to work with Lazy_exact_nt --- Nef_3/include/CGAL/Nef_3/SNC_io_parser.h | 184 +++++++++++++---------- Nef_3/test/Nef_3/test_nef_3_io.cpp | 19 ++- 2 files changed, 120 insertions(+), 83 deletions(-) diff --git a/Nef_3/include/CGAL/Nef_3/SNC_io_parser.h b/Nef_3/include/CGAL/Nef_3/SNC_io_parser.h index 0b15ce02421..2ea2ddeca03 100644 --- a/Nef_3/include/CGAL/Nef_3/SNC_io_parser.h +++ b/Nef_3/include/CGAL/Nef_3/SNC_io_parser.h @@ -34,6 +34,9 @@ #include #include #include +#include +#include + #undef CGAL_NEF_DEBUG #define CGAL_NEF_DEBUG 293 @@ -43,8 +46,81 @@ #include #endif +#include + namespace CGAL { +template class Lazy_exact_nt; +class Homogeneous_tag; +class Cartesian_tag; +template class Simple_cartesian; +template class Simple_homogeneous; +template class Quotient; + +namespace Nef_3_internal{ + +BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(Has_nested_Exact_kernel,Exact_kernel,false) + +template ::value, class FT = typename R::RT, class Kernel_tag=typename R::Kernel_tag> +struct Type_converter{ + typedef const CGAL::Point_3& Point_3; + typedef const CGAL::Vector_3& Vector_3; + typedef const CGAL::Plane_3& Plane_3; + + static Point_3 convert(Point_3 p){return p;} + static Plane_3 convert(Plane_3 p){return p;} + static Vector_3 convert(Vector_3 v){return v;} +}; + +template +struct Type_converter{ + typedef CGAL::Point_3 Point_3; + typedef CGAL::Plane_3 Plane_3; + typedef CGAL::Vector_3 Vector_3; + + static Point_3 convert(const CGAL::Point_3& p){return p.exact();} + static Plane_3 convert(const CGAL::Plane_3& p){return p.exact();} + static Vector_3 convert(const CGAL::Vector_3& v){return v.exact();} +}; + +template +struct Type_converter, ::CGAL::Cartesian_tag >{ + typedef CGAL::Simple_cartesian< NT > EK; + typedef CGAL::Cartesian_converter Converter; + typedef CGAL::Point_3 Point_3; + typedef CGAL::Plane_3 Plane_3; + typedef CGAL::Vector_3 Vector_3; + + static Point_3 convert(const CGAL::Point_3& p){return Converter()(p);} + static Plane_3 convert(const CGAL::Plane_3& p){return Converter()(p);} + static Vector_3 convert(const CGAL::Vector_3& v){return Converter()(v);} +}; + +template +struct Type_converter, ::CGAL::Homogeneous_tag>{ + typedef CGAL::Simple_homogeneous< NT, CGAL::Quotient > EK; + typedef CGAL::Homogeneous_converter Converter; + typedef CGAL::Point_3 Point_3; + typedef CGAL::Plane_3 Plane_3; + typedef CGAL::Vector_3 Vector_3; + + static Point_3 convert(const CGAL::Point_3& p){return Converter()(p);} + static Plane_3 convert(const CGAL::Plane_3& p){return Converter()(p);} + static Vector_3 convert(const CGAL::Vector_3& v){return Converter()(v);} +}; + + +template +typename Type_converter::Point_3 get_point(const CGAL::Point_3& p){ return Type_converter::convert(p); } + +template +typename Type_converter::Plane_3 get_plane(const CGAL::Plane_3& p){ return Type_converter::convert(p); } + +template +typename Type_converter::Vector_3 get_vector(const CGAL::Vector_3& v){ return Type_converter::convert(v); } + +} //end of Nef_3_internal + template class moreLeft : public T { @@ -593,8 +669,7 @@ struct find_minimal_sface_of_shell : public SNC_decorator { SFace_handle& minimal_sface() { return sf_min; } }; -class Homogeneous_tag; -class Cartesian_tag; + template class Geometry_io; template @@ -637,7 +712,7 @@ class Geometry_io { } template static - void print_point(std::ostream& out, const CGAL::Point_3 p) { + void print_point_impl(std::ostream& out, const CGAL::Point_3 p) { typedef Fraction_traits FracTraits; typedef std::vector NV; @@ -668,7 +743,7 @@ class Geometry_io { } template static - void print_vector(std::ostream& out, const CGAL::Vector_3 p) { + void print_vector_impl(std::ostream& out, const CGAL::Vector_3 p) { typedef Fraction_traits FracTraits; typedef typename FracTraits::Numerator_type NumType; typedef std::vector NV; @@ -697,7 +772,7 @@ class Geometry_io { } template static - void print_plane(std::ostream& out, const CGAL::Plane_3 p) { + void print_plane_impl(std::ostream& out, const CGAL::Plane_3 p) { typedef Fraction_traits FracTraits; typedef std::vector NV; @@ -732,80 +807,22 @@ class Geometry_io { out << vec[0] << " " << vec[1] << " " << vec[2] << " " << vec[3]; } -}; -class Epeck; - -template<> -class Geometry_io { - public: - template static - typename EK::Point_3 - read_point(std::istream& in) { - typedef Fraction_traits FracTraits; - typename FracTraits::Type hx, hy, hz, hw; - typename FracTraits::Numerator_type num; - typename FracTraits::Denominator_type denom(1); - typename FracTraits::Compose composer; - in >> num; - hx = composer(num, denom); - in >> num; - hy = composer(num, denom); - in >> num; - hz = composer(num, denom); - in >> num; - hw = composer(num, denom); - return typename EK::Point_3(hx,hy,hz,hw); + template static + void print_point(std::ostream& out, const CGAL::Point_3& p) { + print_point_impl(out, Nef_3_internal::get_point(p) ); } - template static - typename EK::Plane_3 read_plane(std::istream& in) { - typedef Fraction_traits FracTraits; - typename FracTraits::Type a, b, c, d; - typename FracTraits::Numerator_type num; - typename FracTraits::Denominator_type denom(1); - typename FracTraits::Compose composer; - in >> num; - a = composer(num, denom); - in >> num; - b = composer(num, denom); - in >> num; - c = composer(num, denom); - in >> num; - d = composer(num, denom); - return typename EK::Plane_3(a,b,c,d); + template static + void print_vector(std::ostream& out, const CGAL::Vector_3& v) { + print_vector_impl(out, Nef_3_internal::get_vector(v) ); } - template static - void print_point(std::ostream& out, const CGAL::Point_3 p) { - typedef typename Epeck::Exact_kernel SC; - typedef typename SC::Point_3 Exact_point; - typedef Geometry_io Gio; - - Exact_point ep(p.x().exact(), p.y().exact(), p.z().exact()); - Gio::print_point(out, ep); + template static + void print_plane(std::ostream& out, const CGAL::Plane_3& p) { + print_plane_impl(out, Nef_3_internal::get_plane(p) ); } - template static - void print_vector(std::ostream& out, const CGAL::Vector_3 vec) { - typedef typename Epeck::Exact_kernel SC; - typedef typename SC::Vector_3 Exact_vector; - typedef Geometry_io Gio; - - Exact_vector ev(vec.x().exact(), vec.y().exact(), vec.z().exact()); - Gio::print_vector(out, ev); - } - - template static - void print_plane(std::ostream& out, const CGAL::Plane_3 p) { - typedef typename Epeck::Exact_kernel SC; - typedef typename SC::Plane_3 Exact_plane; - typedef Geometry_io Gio; - - Exact_plane ep(p.a().exact(), p.b().exact(), - p.c().exact(), p.d().exact()); - Gio::print_plane(out, ep); - } }; template @@ -826,19 +843,34 @@ class Geometry_io { } template static - void print_point(std::ostream& out, const CGAL::Point_3& p) { + void print_point_impl(std::ostream& out, const CGAL::Point_3& p) { out << p; } template static - void print_vector(std::ostream& out, const CGAL::Vector_3& vec) { + void print_vector_impl(std::ostream& out, const CGAL::Vector_3& vec) { out << vec; } template static - void print_plane(std::ostream& out, const CGAL::Plane_3& p) { + void print_plane_impl(std::ostream& out, const CGAL::Plane_3& p) { out << p; - } + } + + template static + void print_point(std::ostream& out, const CGAL::Point_3& p) { + print_point_impl(out, Nef_3_internal::get_point(p) ); + } + + template static + void print_vector(std::ostream& out, const CGAL::Vector_3& v) { + print_vector_impl(out, Nef_3_internal::get_vector(v) ); + } + + template static + void print_plane(std::ostream& out, const CGAL::Plane_3& p) { + print_plane_impl(out, Nef_3_internal::get_plane(p) ); + } }; template diff --git a/Nef_3/test/Nef_3/test_nef_3_io.cpp b/Nef_3/test/Nef_3/test_nef_3_io.cpp index f47a158d698..ea2eb434f64 100644 --- a/Nef_3/test/Nef_3/test_nef_3_io.cpp +++ b/Nef_3/test/Nef_3/test_nef_3_io.cpp @@ -33,23 +33,28 @@ void test_write_read() typedef CGAL::Polyhedron_3< Kernel > Polyhedron; typedef typename Kernel::Point_3 Point; - Point p(sqrt(2), 0, 0); - Point q( 0,sqrt(2), 0); - Point r( 0, 0,sqrt(2)); - Point s( 0, 0, 0); + Point p(6369051672525773, 0, 0, 4503599627370496); + Point q( 0,6369051672525773, 0, 4503599627370496); + Point r( 0, 0,6369051672525773, 4503599627370496); + Point s( 0, 0, 0, 4503599627370496); + std::cout << " build...\n"; Polyhedron P; P.make_tetrahedron( p, q, r, s); Nef_polyhedron nef_1( P ); + std::cout << " write...\n"; std::ofstream out ("temp.nef"); out << nef_1; out.close(); + std::cout << " read...\n"; std::ifstream in ("temp.nef"); Nef_polyhedron nef_2; in >> nef_2; + in.close(); + std::cout << " check...\n"; assert( nef_1 == nef_2); } @@ -57,15 +62,15 @@ int main() { std::cout << "Testing Exact_predicates_exact_constructions_kernel\n"; test_write_read(); - std::cout << "Testing Cartesian< Lazy_exact_nt >\n"; + std::cout << "Testing Cartesian< FT >\n"; test_write_read(); std::cout << "Testing Simple_cartesian< FT >\n"; test_write_read(); std::cout << "Testing Homogeneous< RT >\n"; test_write_read(); std::cout << "Testing Simple_homogeneous< RT >\n"; - test_write_read(); - std::cout << "Testing Cartesian< FT >\n"; + test_write_read(); + std::cout << "Testing Cartesian< Lazy_exact_nt >\n"; test_write_read(); std::cout << "Testing Simple_cartesian< Lazy_exact_nt >\n"; test_write_read(); From 9610e26737f24c11b8770940473378132c736b8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 21 May 2013 08:39:32 +0200 Subject: [PATCH 5/7] update changes --- Installation/changes.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Installation/changes.html b/Installation/changes.html index 0e2496ccc2e..e0554bdb8dd 100755 --- a/Installation/changes.html +++ b/Installation/changes.html @@ -143,6 +143,11 @@ David A. Wheeler's 'SLOCCount', restricted to the include/CGAL/ faster version. +

3D Boolean Operations on Nef Polyhedra

+
    +
  • Bug-fix in IO when using Lazy_exact_nt as number type or Exact_predicates_exact_constructions_kernel as kernel.
  • +
+

Release 4.2

From 65610a17fd0a0a11813df0a4df60c1e9163708b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 22 May 2013 07:43:57 +0200 Subject: [PATCH 6/7] build number from string (too long int) --- Nef_3/test/Nef_3/test_nef_3_io.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Nef_3/test/Nef_3/test_nef_3_io.cpp b/Nef_3/test/Nef_3/test_nef_3_io.cpp index ea2eb434f64..542e15296cd 100644 --- a/Nef_3/test/Nef_3/test_nef_3_io.cpp +++ b/Nef_3/test/Nef_3/test_nef_3_io.cpp @@ -33,10 +33,13 @@ void test_write_read() typedef CGAL::Polyhedron_3< Kernel > Polyhedron; typedef typename Kernel::Point_3 Point; - Point p(6369051672525773, 0, 0, 4503599627370496); - Point q( 0,6369051672525773, 0, 4503599627370496); - Point r( 0, 0,6369051672525773, 4503599627370496); - Point s( 0, 0, 0, 4503599627370496); + typename Kernel::RT n( std::string("6369051672525773")); + typename Kernel::RT d( std::string("4503599627370496")); + + Point p(n, 0, 0, d); + Point q(0, n, 0, d); + Point r(0, 0, n, d); + Point s(0, 0, 0, 1); std::cout << " build...\n"; Polyhedron P; From d3f82210bf2640b2b77a2ab145efb28b60cc47e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 23 May 2013 11:08:34 +0200 Subject: [PATCH 7/7] remove VC warning: change class to struct --- Nef_3/include/CGAL/Nef_3/SNC_io_parser.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Nef_3/include/CGAL/Nef_3/SNC_io_parser.h b/Nef_3/include/CGAL/Nef_3/SNC_io_parser.h index 2ea2ddeca03..b15d1d8e985 100644 --- a/Nef_3/include/CGAL/Nef_3/SNC_io_parser.h +++ b/Nef_3/include/CGAL/Nef_3/SNC_io_parser.h @@ -53,8 +53,8 @@ namespace CGAL { template class Lazy_exact_nt; class Homogeneous_tag; class Cartesian_tag; -template class Simple_cartesian; -template class Simple_homogeneous; +template struct Simple_cartesian; +template struct Simple_homogeneous; template class Quotient; namespace Nef_3_internal{