From 6a767e83e5eec76b58feb9f1d8ae0af93c7f5308 Mon Sep 17 00:00:00 2001
From: Florian Uhlig <f.uhlig@gsi.de>
Date: Fri, 3 Dec 2021 15:12:36 +0100
Subject: [PATCH] Fix linker problem with template function

The implementation of the function was in the source file. Since the
function was also used in a qa class no code code be created at that
place. This results in a missing symbol during linking.
Put the template code properly in the header solves the problem.
---
 reco/littrack/cbm/base/CbmLitFieldFitter.cxx | 15 ---------------
 reco/littrack/cbm/base/CbmLitFieldFitter.h   | 14 +++++++++++++-
 2 files changed, 13 insertions(+), 16 deletions(-)

diff --git a/reco/littrack/cbm/base/CbmLitFieldFitter.cxx b/reco/littrack/cbm/base/CbmLitFieldFitter.cxx
index 71c49c2f24..18d7698583 100644
--- a/reco/littrack/cbm/base/CbmLitFieldFitter.cxx
+++ b/reco/littrack/cbm/base/CbmLitFieldFitter.cxx
@@ -801,21 +801,6 @@ CbmLitFieldFitter::CbmLitFieldFitter(unsigned int polynomDegree)
 
 CbmLitFieldFitter::~CbmLitFieldFitter() {}
 
-template<class T>
-void CbmLitFieldFitter::FitSlice(float Z, lit::parallel::LitFieldSlice<T>& slice)
-{
-  std::vector<double> aparBx, aparBy, aparBz;
-  FitSlice(Z, aparBx, aparBy, aparBz);
-
-  std::vector<T> aparBxT, aparByT, aparBzT;
-  aparBxT.assign(aparBx.begin(), aparBx.end());
-  aparByT.assign(aparBy.begin(), aparBy.end());
-  aparBzT.assign(aparBz.begin(), aparBz.end());
-
-  slice.SetZ(Z);
-  slice.SetCoefficients(aparBxT, aparByT, aparBzT);
-}
-
 void CbmLitFieldFitter::FitSliceScal(float Z, lit::parallel::LitFieldSlice<fscal>& slice) { FitSlice<fscal>(Z, slice); }
 
 void CbmLitFieldFitter::FitSliceVec(float Z, lit::parallel::LitFieldSlice<fvec>& slice) { FitSlice<fvec>(Z, slice); }
diff --git a/reco/littrack/cbm/base/CbmLitFieldFitter.h b/reco/littrack/cbm/base/CbmLitFieldFitter.h
index fa6c95ed30..d0d5195b5f 100644
--- a/reco/littrack/cbm/base/CbmLitFieldFitter.h
+++ b/reco/littrack/cbm/base/CbmLitFieldFitter.h
@@ -81,7 +81,19 @@ public:
     * \param[out] slice Output approximated field slice.
     */
   template<class T>
-  void FitSlice(float Z, lit::parallel::LitFieldSlice<T>& slice);
+  void FitSlice(float Z, lit::parallel::LitFieldSlice<T>& slice)
+  {
+    std::vector<double> aparBx, aparBy, aparBz;
+    FitSlice(Z, aparBx, aparBy, aparBz);
+
+    std::vector<T> aparBxT, aparByT, aparBzT;
+    aparBxT.assign(aparBx.begin(), aparBx.end());
+    aparByT.assign(aparBy.begin(), aparBy.end());
+    aparBzT.assign(aparBz.begin(), aparBz.end());
+
+    slice.SetZ(Z);
+    slice.SetCoefficients(aparBxT, aparByT, aparBzT);
+  }
 
   /**
     * \brief FitSlice implementation using fscal data type.
-- 
GitLab