Проблема заключается в том, как Эйген определяет result_of
:
#if EIGEN_HAS_STD_RESULT_OF
template<typename T> struct result_of {
typedef typename std::result_of<T>::type type1;
typedef typename remove_all<type1>::type type;
};
#else
//...
, где remove_all
удаляет указатель типа.Я проверю, не нарушает ли это что-то еще, но на самом деле размещение указателей в матрицах - это не то, для чего они предназначены.
Чтобы обойти проблему, можно обернуть указатель в тривиальную обертку-указатель:
template<class X>
struct Ptr {
X* ptr;
operator X*() const {return ptr;}
X& operator*() const {return *ptr;}
X* operator->() const {return ptr;}
Ptr(X* p = 0) : ptr(p) {}
Ptr& operator=(X* p) {ptr = p; return *this;}
};
и заменить каждый s1*
на Ptr<s1>
: https://godbolt.org/z/b_EtDw