Вопрос специализации вложенных шаблонов классов - PullRequest
0 голосов
/ 21 января 2019

У меня есть тип enum, который описывает методы анализа некоторых объектов. Например. Я могу разобрать "len100" как строку или перечисление. Nested struct Native принимает аргумент шаблона, который описывает тип переменной, в которой будет содержаться значение. Например. "len100" может быть сохранен в строку или uint. Но этот код дает мне ошибку:

"invalid use of incomplete type 'struct Evaluator<(Type)3>::Native<T>'"

в этой строке:

T Evaluator<Type::jarray>::Native<T>::eval() {

Это происходит также с векторной специализацией. Как я могу решить эту проблему и есть ли лучшее решение для этой задачи?

enum class Type
{
      juint
    , jstring
    , jenum
    , jarray
};

template<Type type>
struct Evaluator
{
    template<typename T>
    struct Native {
        static T eval();
    };
};

template<>
template<typename T>
T Evaluator<Type::jarray>::Native<T>::eval() {
    cout << "primitive" << endl;
    return T{};
}

template<>
template<typename T>
T Evaluator<Type::jarray>::Native<vector<T>>::eval() {
    cout << "vector" << endl;
    return T{};
}

int main() {
    Evaluator<Type::jarray>::Native<vector<int>>::eval();
}

1 Ответ

0 голосов
/ 21 января 2019

В первом случае вы пытаетесь указать специализацию участника для неспециализированного шаблона специализации.

Это запрещено.Акт специализации должен быть нисходящим, от инкапсулирующего класса к его члену.Сначала вы специализируете инкапсулирующий класс или специализируете инкапсулирующий класс для одного из его элементов-членов.Затем вы можете специализировать этот шаблон члена и т. Д.

Вторая ошибка заключается в том, что вы пытаетесь указать специализацию члена 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...