Нет, это невозможно.Шаблон класса члена может быть специализированным только в том случае, если все его шаблоны классов также являются специализированными.Цитирование C ++ 2x (N4713) [temp.expl.spec] 17.8.3 / 17:
В явном объявлении специализации для члена шаблона класса или шаблон элемента , который появляется в области пространства имен, шаблон элемента и некоторые из его шаблонов классов, в которые он включен, могут оставаться не специализированными, за исключением того, что объявление не должно явно специализировать шаблон элемента класса, если его шаблоны классов не являютсятакже явно специализированные.
(выделение мое)
В некоторых случаях вы можете обойти это, сделав вложенное имя s
псевдонимом пространства имен.помощник области, который может быть частично специализированным.Примерно так:
template <class some, int num>
struct s_helper
{
int ret() { return num; }
};
template<typename some>
class owner
{
template<int num>
using s = s_helper<some, num>;
};
template<typename some>
struct s_helper<some, 0>
{
int ret() { return 0; }
};
Чтобы уменьшить экспозицию s_helper
, ее, конечно, можно спрятать в подходяще названном внутреннем пространстве имен (например, detail
).