枚举专用模板

时间:2010-11-21 15:48:33

标签: c++ templates

有谁能告诉我为什么这不起作用?

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;
}

4 个答案:

答案 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;
}