Ваш код должен работать, если Eigen::Array3d
является псевдонимом (через using
или typedef
) Eigen::ArrayBase<T>
для некоторых T
.
Но я предполагаю, что Eigen::Array3d
наследуется от Eigen::ArrayBase<T>
.Так что не `` Eigen :: ArrayBase``, поэтому не соответствует частичной специализации, поэтому соответствует основному шаблону.
Если вы хотите специализацию, которая перехватывает все классы, производные от Eigen::ArrayBase
, aВозможное решение - добавить дополнительный параметр шаблона со значением по умолчанию и активировать только специализацию T
, полученную из некоторого Eigen::ArrayBase
.
Что-то следующее (осторожно: код не проверен)
constexpr std::false_type isArray (...);
template <typename T>
constexpr std::true_type isArray (Eigen::ArrayBase<T> const *);
template <typename T, typename = std::true_type>
class DerivedClass : public BaseClass<T>
{
public:
DerivedClass(T arg): BaseClass<T>(arg){};
};
template <typename T>
class DerivedClass<T, decltype(isArray(std::declval<T*>())>
: public DerivedClass<T>
{
public:
DerivedClass (T arg) : BaseClass<T>(arg){};
};