diff --git a/Modules/Core/Functor/include/otbFunctorImageFilter.h b/Modules/Core/Functor/include/otbFunctorImageFilter.h
index 073944cf4d25016b7949c28e8070df7f8bdd4f48..3d46b8633bcf5d6b4ebc3dcb7ff2a26e80b9e2d2 100644
--- a/Modules/Core/Functor/include/otbFunctorImageFilter.h
+++ b/Modules/Core/Functor/include/otbFunctorImageFilter.h
@@ -118,6 +118,20 @@ template <class T> struct ImageTypeDeduction<itk::VariableLengthVector<T>>
 /// that has std::remove_cvref)
 template <typename T> using RemoveCVRef = typename std::remove_cv<typename std::remove_reference<T>::type>::type;
 
+/**
+* \struct RetrieveOperator
+*
+* \brief Struct to retrieve the operator type
+* 
+* \tparam T the type to retrieve operator() from
+*
+*/
+template <typename T> struct RetrieveOperator
+{
+  static_assert(std::is_class<T>::value || std::is_function<T>::value, "T is not a class or function");
+  using Type = decltype(&T::operator());
+};
+
 /**
 * \struct FunctorFilterSuperclassHelper 
 * \brief Struct allowing to derive the superclass prototype for the
@@ -130,7 +144,7 @@ template <typename T> using RemoveCVRef = typename std::remove_cv<typename std::
 * - InputHasNeighborhood a tuple of N false_type or true_type to denote
 * - if Ith arg of operator() expects a neighborhood.
 */
-template <typename T, typename TNameMap> struct FunctorFilterSuperclassHelper : public FunctorFilterSuperclassHelper<decltype(&std::remove_reference<T>::type::operator()),TNameMap> {};
+template <typename T, typename TNameMap> struct FunctorFilterSuperclassHelper : public FunctorFilterSuperclassHelper<typename RetrieveOperator<T>::Type,TNameMap> {};
 
 namespace functor_filter_details
 {
@@ -362,11 +376,10 @@ template <typename Functor, typename TNameMap> auto NewFunctorFilter(Functor f,
  * It is used internally in NewFunctorFilter version with
  * numberOfOutputBands parameter.
  */ 
-template <typename F> struct NumberOfOutputBandsDecorator : F
+template <typename F> struct NumberOfOutputBandsDecorator : public F
 {
 public:
   constexpr NumberOfOutputBandsDecorator(F t, unsigned int nbComp) : F(t), m_NumberOfOutputBands(nbComp) {}
-  using F::operator();
 
   constexpr size_t OutputSize(...) const
   {
diff --git a/Modules/Core/Functor/include/otbFunctorImageFilter.hxx b/Modules/Core/Functor/include/otbFunctorImageFilter.hxx
index f7b9950ae9195234dc3905a49f7afdf027209751..add3fadcc4e18acef2bd4acb837fa2c93b3567e1 100644
--- a/Modules/Core/Functor/include/otbFunctorImageFilter.hxx
+++ b/Modules/Core/Functor/include/otbFunctorImageFilter.hxx
@@ -141,7 +141,9 @@ template <typename T> struct GetProxy<itk::ConstNeighborhoodIterator<T> >
 }
 };
 
-template <class Oper> struct OperProxy : public OperProxy<decltype(&std::remove_reference<Oper>::type::operator())> {};
+/// Proxy for operator (dispatch between void operator()(Out &
+/// out,...) and Out operator()(...)
+template <class Oper> struct OperProxy : public OperProxy<typename RetrieveOperator<Oper>::Type> {};
 
 template<class Out, class ... In> struct OperProxy<Out(*)(In...)>
 {