]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Fix instantiation issue with FlatManifold properly 63/head
authorMatthias Maier <matthias.maier@iwr.uni-heidelberg.de>
Thu, 7 Aug 2014 11:07:45 +0000 (13:07 +0200)
committerMatthias Maier <tamiko@kyomu.43-1.org>
Thu, 7 Aug 2014 12:43:11 +0000 (14:43 +0200)
This commit reverts the quick fix in commit 982b0683.

This commit closes #56

The issue why we encountered unresolved references to
dealii::FlatManifold<3, 2>::FlatManifold(dealii::Point<2, double>, double)
etc. was due to boilerplate instantiations of Triangulation::get_manifold
for cases with spacedim < dim (in order to make TriaAccessor happy).

This commit fixes the issue by using a nullptr-dereference in order to
return an invalid object - the specific code throws an error message before
that and should actually not be reachable at all.

source/grid/manifold.inst.in
source/grid/tria.cc

index a611e2c5102f260f0e2b7facbac881ecdbe1d288..164e479df24d29d97e9df18092b25bf44fc3b8ee 100644 (file)
 
 for (deal_II_dimension : DIMENSIONS; deal_II_space_dimension :  SPACE_DIMENSIONS)
   {
+#if deal_II_dimension <= deal_II_space_dimension
     template class Manifold<deal_II_dimension, deal_II_space_dimension>;
     template class FlatManifold<deal_II_dimension, deal_II_space_dimension>;
 
     template class ManifoldChart<deal_II_dimension, deal_II_space_dimension, 1>;
     template class ManifoldChart<deal_II_dimension, deal_II_space_dimension, 2>;
     template class ManifoldChart<deal_II_dimension, deal_II_space_dimension, 3>;
+#endif
   }
 
 
index 8169c5952ae0521f74b633036eb58db3ef93548c..ff37b0787ed9565e4cda44ddb0b8b1e1c2d8a407 100644 (file)
@@ -13292,22 +13292,31 @@ Triangulation<dim, spacedim>::remove_refinement_listener (RefinementListener &li
 template <>
 const Manifold<2,1> & Triangulation<2, 1>::get_manifold(const types::manifold_id) const {
   Assert(false, ExcImpossibleInDim(1));
-  static FlatManifold<2,1> flat;
-  return flat;
+  // We cannot simply create a temporary Manifold<2,1> because it is not
+  // instantiated and would lead to unresolved symbols. Given the fact that
+  // this function should be unreachable anyaway, just dereference a
+  // nullptr:
+  return *static_cast<FlatManifold<2,1>*>(0);
 }
 
 template <>
 const Manifold<3,1> & Triangulation<3, 1>::get_manifold(const types::manifold_id) const {
   Assert(false, ExcImpossibleInDim(1));
-  static FlatManifold<3,1> flat;
-  return flat;
+  // We cannot simply create a temporary Manifold<2,1> because it is not
+  // instantiated and would lead to unresolved symbols. Given the fact that
+  // this function should be unreachable anyaway, just dereference a
+  // nullptr:
+  return *static_cast<FlatManifold<3,1>*>(0);
 }
 
 template <>
 const Manifold<3,2> & Triangulation<3, 2>::get_manifold(const types::manifold_id) const {
   Assert(false, ExcImpossibleInDim(2));
-  static FlatManifold<3,2> flat;
-  return flat;
+  // We cannot simply create a temporary Manifold<2,1> because it is not
+  // instantiated and would lead to unresolved symbols. Given the fact that
+  // this function should be unreachable anyaway, just dereference a
+  // nullptr:
+  return *static_cast<FlatManifold<3,2>*>(0);
 }
 
 // explicit instantiations

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.