Делая enum приведение к int - PullRequest
       1

Делая enum приведение к int

11 голосов
/ 01 сентября 2011

У меня проблема с этим кодом:

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?

Ответы [ 2 ]

12 голосов
/ 01 сентября 2011

Ваша проблема связана с тем, что шаблон не может быть создан из аргументов функции, которые вы предоставляете. Неявное преобразование в int не происходит, потому что вообще нет функции для вызова .

Если вы преобразуете вместо попытки неявного преобразования, ваша программа будет работать :

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

Или, если вы предоставите аргументы шаблона функции явно, то аргумент функции будет преобразован неявно, как вы ожидаете, и ваша программа будет работать :

dosth<int>(k, SITUATION1);
2 голосов
/ 01 сентября 2011

Будет ли это лучше для перечислений?

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

Включит безопасность типов.Затем используйте его для создания шаблона типа safte.

т.е. Значение для передачи или неудачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...