嵌套类模板专用化问题



我有一个枚举类型,它描述了解析某些对象的方法。 例如,我可以将"len100"解析为字符串或枚举。嵌套结构本机采用模板参数,该参数描述将包含值的变量类型。例如,"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();
}

对于第一种情况,您尝试提供专用化的非专用模板成员的成员专用化。

这是禁止的。专业化的行为必须是下降的,从封装类到其成员。首先,专用化封装类或专用化其成员模板之一的封装类。然后,您可以专用化此成员模板,依此类推。

第二个错误是因为您尝试为未声明的部分专用化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();
}

最新更新