【问题标题】:Nested class template specialization issue嵌套类模板专业化问题
【发布时间】:2019-01-21 13:37:15
【问题描述】:

我有一个枚举类型,它描述了解析某些对象的方法。例如。我可以将“len100”解析为字符串或者枚举。嵌套结构 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();
}

【问题讨论】:

  • 你为什么不使用type_trais ? IE。 is_pointer -> 然后是 is_arithmetic、is_same 等。
  • 您正在创建外部模板的专业化。它可以提供完整的子类型和值的新定义,省略一些添加一些东西,所以你需要新的声明。

标签: c++ templates


【解决方案1】:

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

这是禁止的。专业化的行为必须是递减的,从封装类到它的成员。首先,您专门化封装类或专门为其成员模板之一封装类。然后你可以专门化这个成员模板,等等。

第二个错误是因为您尝试为未声明的部分特化 Native&lt;vector&lt;int&gt;&gt; 提供成员 eval 的特化。

因此,要解决您的问题,唯一的选择是将整个模板类 Native 专门化为专门化 Evaluator&lt;Type::Jarray&gt;。然后你还必须为之前定义的成员模板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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2013-12-04
    相关资源
    最近更新 更多