Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 嵌套类模板专门化问题_C++_Templates - Fatal编程技术网

C++ 嵌套类模板专门化问题

C++ 嵌套类模板专门化问题,c++,templates,C++,Templates,我有一个枚举类型,它描述解析某些对象的方法。例如,我可以将“len100”解析为字符串或枚举。Nested struct Native接受一个模板参数,该参数描述将包含值的变量类型。例如,“len100”可以保存为字符串或uint。但这段代码给了我一个错误: “不完整类型'struct Evaluator::Native'的使用无效” 在这一行: T Evaluator::Native::eval(){ 向量专门化也会出现这种情况。我如何解决这个问题?有更好的解决方案来处理这个任务吗 enum

我有一个枚举类型,它描述解析某些对象的方法。例如,我可以将“len100”解析为字符串或枚举。Nested struct Native接受一个模板参数,该参数描述将包含值的变量类型。例如,“len100”可以保存为字符串或uint。但这段代码给了我一个错误:

“不完整类型'struct Evaluator::Native'的使用无效”

在这一行:

T Evaluator::Native::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();
}
enum类类型
{
朱因
,jstring
,jenum
,jarray
};
样板
结构计算器
{
样板
结构本机{
静态T值();
};
};
样板
样板
T Evaluator::Native::eval(){

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

这是禁止的。专门化的行为必须从封装类向其成员递减。首先专门化封装类或为其成员模板之一专门化封装类。然后可以专门化此成员模板,依此类推

第二个错误是因为您试图为未声明的部分专门化
本机
提供成员
eval
的专门化

因此,要解决您的问题,唯一的选择是专门化整个模板类
Native
,用于专门化
Evaluator
。然后您还必须为先前定义的成员模板
Native
(本身就是一个成员专门化…哎哟!):

#包括
#包括
枚举类类型
{
朱因
,jstring
,jenum
,jarray
};
样板
结构计算器
{
样板
结构本机{
静态T值();
};
};
//这里我们为Evaluator提供了一个成员专门化
//结构计算器不是完全专用的
//它只为其一个成员专门设计。
//这个成员是一个模板
样板
样板
结构计算器::本机{
静态T eval(){

std::cout为什么不使用?即is_pointer->then is_算术,is_same等。您正在创建外部模板的专门化。它可以提供子类型和值的完整新定义,省略某些内容添加某些内容,因此您需要对其进行新的声明。
#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();
}