有谁能告诉我为什么这不起作用?
enum CompCriteria{ByKey,ByValue,ByeKeyAndValue};
template<class T>
struct X;
template<>
struct X<CompCriteria>
{
};
int _tmain(int argc, _TCHAR* argv[])
{
X<CompCriteria::ByeKeyAndValue> x;
return 0;
}
答案 0 :(得分:9)
您正在混淆参数化类型和参数化值的想法。模板参数可以是类型或常量。例如:
template <typename T>
struct Foo;
对..
template <int N>
struct Foo;
您希望根据枚举常量而不是类型来专门化您的模板。意思是,你需要说:
enum CompCriteria{ByKey,ByValue,ByeKeyAndValue};
template<CompCriteria>
struct X;
// Specialization for ByKeyAndValue
//
template<>
struct X<ByeKeyAndValue>
{
};
int main()
{
X<ByeKeyAndValue> x; // instantiate specialization
return 0;
}
此外,您无法使用namespace
运算符引用枚举。如果要封装枚举,则需要将它们包装在命名空间中:
namespace CompCriteria
{
enum type {ByKey,ByValue,ByeKeyAndValue};
}
答案 1 :(得分:2)
如果您有template<class T>
= template<typename T>
,那么预计T就是类型。
enum CompCriteria
是一种类型,因此您可以使用它来实例化该模板。但是,枚举的单个值不是类型,因此您不能。
答案 2 :(得分:2)
您对某个类型有专门的X
,但您尝试将其与整数CompCriteria::ByeKeyAndValue
一起使用。
在这种情况下,您可以为enum CompCriteria
基础类型 - int
专门化模板类,如下所示:
enum CompCriteria{ByKey,ByValue,ByeKeyAndValue};
template<int>
struct X;
template<>
struct X<ByeKeyAndValue>
{
};
int main()
{
X<ByeKeyAndValue> x;
return 0;
}
答案 3 :(得分:2)
enum CompCriteria{ByKey,ByValue,ByeKeyAndValue};
template<CompCriteria crit_>
struct X
{
static const CompCriteria crit = crit_;
};
int _tmain(int argc, _TCHAR* argv[])
{
X<CompCriteria::ByeKeyAndValue> x;
return 0;
}