То, что вы пытаетесь сделать, называется частичной специализацией.Вы пытаетесь специализировать ваш foo
, чтобы он работал по-разному для семейства типов - т.е. типов, которые являются экземплярами Eigen::DenseBase
.К сожалению, это невозможно.
Функции-члены шаблонных классов могут быть только полностью специализированными, то есть реализация может быть предоставлена для определенного типа.Например, это сработает:
template <>
void myClass<char*>::foo(char* );
Единственный способ частичной специализации вашего foo - это частичная специализация для всего класса.Примерно так:
template <typename T>
class myClass{
...
void foo(T);
...
};
template<class T>
class myClass<Eigen::DenseBase<T>> {
void foo(Eigen::DenseBase<T> ) { ...}
};
Предостережение заключается в том, что если вы (частично) специализируете класс, вам нужно предоставить всех членов, которые должны быть там, из исходного шаблона (часто много копий).дублирование).Стандартное решение здесь - поместить в базовый класс все, что не зависит от частичной специализации, и унаследовать от него ваш шаблон и специализацию.