【问题标题】:Doing enum cast to int将枚举强制转换为 int
【发布时间】:2011-08-31 21:29:33
【问题描述】:

我对这段代码有疑问:

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&,)'

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

【问题讨论】:

标签: c++ templates casting enums


【解决方案1】:

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

如果你转换而不是尝试依赖隐式转换,your program will work:

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

或者,如果您显式提供函数模板的参数,那么函数参数将按照您的预期进行隐式转换,your program will work:

dosth<int>(k, SITUATION1);

【讨论】:

  • @Tomalak 如果我把函数声明改成template &lt;typename T,typename DEFAULT_T&gt; void dosth(T&amp; value, const DEFAULT_T&amp; default_value),为什么还是不能进行隐式转换?
  • @xis19:单独的问题;那里根本不涉及隐式转换。但是,在 C++03 中,template arguments may not be unnamed types ([C++03: 14.3.1/2]);这是no longer the case in C++0x。
  • 抱歉所有的编辑;一开始我弄错了,直到我进行了所有迭代更改后才意识到它的严重程度。
  • 顺便说一句:也许另一种方法是使用static const int DEFAULT_VALUE=SITUATION1;
【解决方案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; }
};

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

即通过或失败的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    • 2010-09-06
    相关资源
    最近更新 更多