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