我有一个枚举类型,它描述了解析某些对象的方法。 例如,我可以将"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();
}