В первом случае вы пытаетесь указать специализацию участника для неспециализированного шаблона специализации.
Это запрещено.Акт специализации должен быть нисходящим, от инкапсулирующего класса к его члену.Сначала вы специализируете инкапсулирующий класс или специализируете инкапсулирующий класс для одного из его элементов-членов.Затем вы можете специализировать этот шаблон члена и т. Д.
Вторая ошибка заключается в том, что вы пытаетесь указать специализацию члена eval
для необъявленной частичной специализации Native<vector<int>>
.
Таким образом, чтобы решить вашу проблему, единственный вариант - это специализация всего класса шаблона Native
для специализации Evaluator<Type::Jarray>
.Затем вы также должны определить частичную специализацию для ранее определенного шаблона элемента Native
(сама специализация элемента ... ой!):
#include <iostream>
#include <vector>
enum class Type
{
juint
, jstring
, jenum
, jarray
};
template<Type type>
struct Evaluator
{
template<typename T>
struct Native {
static T eval();
};
};
//here we provide a member specialization for Evaluator
//the struct Evaluator is not entirely specialized
//it is specialized for only one of its member.
//and this member is an template
template<>
template<typename T>
struct Evaluator<Type::jarray>::Native{
static T eval(){
std::cout << "primitive" << std::endl;
return T{};
}
};
//Here we declare a partial specialization of the
//member `Native` of `Evaluator` specialized just above.
template<>
template<typename T>
struct Evaluator<Type::jarray>::Native<std::vector<T>>{
static T eval() {
std::cout << "vector" << std::endl;
return T{};
}
};
int main() {
Evaluator<Type::jarray>::Native<std::vector<int>>::eval();
Evaluator<Type::jarray>::Native<int>::eval();
}