将枚举转换为int

时间:2011-08-31 21:29:33

标签: c++ templates casting enums

我在这段代码上遇到了问题:

template <typename T>
void dosth(T& value,const T& default_value)
{
   if (condition)
       value = 10;
   else
       value = default_value;
}

当我用

打电话时
enum {
    SITUATION1,
    STIUATION2
};

int k;
dosth(k,SITUATION1);

编译器(g ++ 4.5)说

  

没有用于调用'dosth(int&amp;,)'

的匹配函数

为什么编译器不会自动将枚举转换为int?

2 个答案:

答案 0 :(得分:12)

Your problem是因为模板无法从您提供的函数参数中实例化。没有隐式转换为int,因为根本无法调用

如果您投射而不是尝试依赖隐式转换,your program will work

dosth(k, static_cast<int>(SITUATION1));

或者,如果您明确提供函数模板的参数,那么函数参数将按预期隐式转换,并your program will work

dosth<int>(k, SITUATION1);

答案 1 :(得分:2)

这对于枚举会更好吗?

class Situations
{
  private:
    const int value;
    Situations(int value) : value(value) {};
  public:
    static const Situations SITUATION1() { return 1; }
    static const Situations SITUATION2() { return 2; }
    int AsInt() const { return value; }
};

将启用类型安全。然后用它来创建一个类型的安全模板。

即。通过或失败的价值。