2016-05-09 2 views
0

Я создавал код, чтобы показывать месяцы года в соответствии с пользовательским вводом, но я получаю сообщение об ошибке на линии «mes = n». Вот код ниже:Ошибка при присвоении перечисления переменной

#include <iostream> 
using namespace std; 
int main(){ 
int n = 0; 
enum meses {Janeiro = 1, Fevereiro = 2, Marco = 3, Abril = 4, Maio = 5, Junho= 6, 
Julho = 7, Agosto = 8, Setembro = 9, Outubro = 10,Novembro = 11, Dezembro = 12}mes; 
cin>>n; 
mes = n; // That's where I get an error! 
switch(mes) 
{ 
    case Janeiro: cout<<"janeiro"; break; 
    case Fevereiro: cout<<"fevereiro"; break; 
    case Marco: cout<<"marco"; break; 
    case Abril: cout<<"abril"; break; 
    case Maio: cout<<"maio"; break; 
    case Junho: cout<<"junho"; break; 
    case Julho: cout<<"julho"; break; 
    case Agosto: cout<<"agosto"; break; 
    case Setembro: cout<<"setembro"; break; 
    case Outubro: cout<<"outubro"; break; 
    case Novembro: cout<<"novembro"; break; 
    case Dezembro: cout<<"dezembro"; break; 
    default: cout<<"invalido"; break; 
} 
return 0; 
}  

Ошибка компилятора: "недействительные преобразование INT в основной() :: MESES".

+1

При отправке вопросов, пожалуйста, добавьте вывод компилятора, поэтому мы знаем об ошибке вы получаете – ddeunagomez

+0

@QualityCatalyst 'mes' определяется в строке, начинающейся с 'enum meses'. – immibis

+1

@ excalibur1491 ОК, я сейчас редактировал и добавил ошибку компилятора. Я здесь новый, поэтому спасибо за совет. –

ответ

3

В стандартном C++ отсутствует неявное преобразование вenum тип. Поэтому вы не можете просто написать mes = n;. Чтобы сделать это преобразование, что вам нужно сделать это явно, например .:

mes = static_cast<meses>(n); 

Тем не менее, является неявного преобразования из незаданной enum s кint. (Технически это целая реклама). Таким образом, вы не нуждались бы в гипсе:

int x = Janeiro; 

Итак, еще одно решение вашей проблемы будет использовать int для хранения значения, которое было ввода. На самом деле у вас уже есть n выполняет эту роль:

switch(n) 
{ 
case Janeiro: ..... 

Как и выше, не литой не требуется для case Janeiro, поскольку незаданные счетчики способствуют целому типу.

Технически вы должны использовать std::underlying_type<meses>::type вместо int, если есть счетчики, превышающие INT_MAX.

Если вы хотите, чтобы для обоих направлений преобразования (для перечисления в int и int для перечисления) был выбран литой, тогда вы должны использовать перечисление с областью, т.е.enum class meses.

0

У вас синтаксис неправильный. Вот как это должно быть:

enum meses { 
    Janeiro = 1, Fevereiro = 2, Marco = 3, Abril = 4, Maio = 5, Junho= 6, 
    Julho = 7, Agosto = 8, Setembro = 9, Outubro = 10,Novembro = 11, Dezembro = 12 
}; 
cin>>n; 
meses mes = n; 
switch(mes) 
... 

Или для контекстного перечисления (C++ 11):

enum class meses { 
    Janeiro = 1, Fevereiro = 2, Marco = 3, Abril = 4, Maio = 5, Junho= 6, 
    Julho = 7, Agosto = 8, Setembro = 9, Outubro = 10,Novembro = 11, Dezembro = 12 
}; 
... 

Где можно использовать meses::janiero и т.д ...

+0

Я думаю, что OP пыталась создать переменную, называемую 'mes' типа enum. Синтаксис не ошибочен, просто переименование никогда не будет повторно использоваться (но нет ничего плохого в этом, если это то, что он хочет). И ваше решение не скомпилировано ни (стандартное C++), из-за «meses mes = n;»: '10:13: error: недопустимое преобразование из 'int' в 'main() :: meses' [-fpermissive] ' – ddeunagomez

1

Существует пара вопросов, я даю вам 3 возможных фиксированных и объясните ниже:

#include <iostream> 
using namespace std; 
int main(){ 
    int n = 0; 
    //Using a local variable only: 
    //* 
    enum meses {Janeiro = 1, Fevereiro = 2, Marco = 3, Abril = 4, Maio = 5, Junho= 6, 
    Julho = 7, Agosto = 8, Setembro = 9, Outubro = 10,Novembro = 11, Dezembro = 12}mes; 
    cin>>n; 
    mes = (meses)n; // Cast to convert int into a meses_type 
    //*/ 

    //Or declaring the enum: 
    /* 
    enum meses {Janeiro = 1, Fevereiro = 2, Marco = 3, Abril = 4, Maio = 5, Junho= 6, 
    Julho = 7, Agosto = 8, Setembro = 9, Outubro = 10,Novembro = 11, Dezembro = 12}; 
    cin>>n; 
    meses mes = (meses)n; // Cast to convert int into a meses_type 
    //*/ 

    // Using typedef 
    /* 
    typedef enum meses {Janeiro = 1, Fevereiro = 2, Marco = 3, Abril = 4, Maio = 5, Junho= 6, 
    Julho = 7, Agosto = 8, Setembro = 9, Outubro = 10,Novembro = 11, Dezembro = 12}meses_type; 
    cin>>n; 
    meses_type mes = (meses_type)n; // Cast to convert int into a meses_type 
    //*/ 

    switch(mes) 
    { 
     case Janeiro: cout<<"janeiro"; break; 
     case Fevereiro: cout<<"fevereiro"; break; 
     case Marco: cout<<"marco"; break; 
     case Abril: cout<<"abril"; break; 
     case Maio: cout<<"maio"; break; 
     case Junho: cout<<"junho"; break; 
     case Julho: cout<<"julho"; break; 
     case Agosto: cout<<"agosto"; break; 
     case Setembro: cout<<"setembro"; break; 
     case Outubro: cout<<"outubro"; break; 
     case Novembro: cout<<"novembro"; break; 
     case Dezembro: cout<<"dezembro"; break; 
     default: cout<<"invalido"; break; 
    } 
    return 0; 
} 

Первое решение - это то, что вы намеревались я думаю.

1) Создает переменную типа enum meses под названием mes. Тип перечисления можно использовать только здесь, для этой переменной. 2) Создал перечисление, затем переменную. таким образом вы можете создать несколько экземпляров этого типа перечислений. 3) Использует typedef для сокращения имени (хотя и не очень полезного, более интересного для структуры, чем для перечисления).

И, наконец, чтобы поместить int в переменную типа enum, вам нужно ввести текст в тип перечисления. C++ думает об этих вещах как о совершенно разных объектах (хотя перечисление в конечном итоге представляет собой просто набор ints).

+1

как общий принцип, я бы рекомендовал использовать приведения в стиле C++, т. Е.' Mes = static_cast (n); ', потому что риск ошибки меньше. Ваша версия 3 добавляет словосочетание без причины. –

+0

Вы правы для актеров. (Третья версия была просто для того, чтобы показать использование typedefs, синтаксис, используемый OP, заставил меня подумать, что, возможно, это было его намерение, но забыло ключевое слово typedef) – ddeunagomez

0

Вы могли бы просто использовать switch(n):

int main() { 
    int n = 0; 
    enum meses {Janeiro = 1, Fevereiro = 2, Marco = 3, Abril = 4, Maio = 5, 
     Junho= 6, Julho = 7, Agosto = 8, Setembro = 9, Outubro = 10, 
     Novembro = 11, Dezembro = 12}; 

    cin >> n; 
    switch(n) 
    { 
     case Janeiro: cout<<"janeiro"; break; 
     case Fevereiro: cout<<"fevereiro"; break; 
     case Marco: cout<<"marco"; break; 
     case Abril: cout<<"abril"; break; 
     case Maio: cout<<"maio"; break; 
     case Junho: cout<<"junho"; break; 
     case Julho: cout<<"julho"; break; 
     case Agosto: cout<<"agosto"; break; 
     case Setembro: cout<<"setembro"; break; 
     case Outubro: cout<<"outubro"; break; 
     case Novembro: cout<<"novembro"; break; 
     case Dezembro: cout<<"dezembro"; break; 
     default: cout<<"invalido"; break; 
    } 
    return 0; 
}  

Или используйте static_cast<meses>(n):

int main() { 
    int n = 0; 
    enum meses {Janeiro = 1, Fevereiro = 2, Marco = 3, Abril = 4, Maio = 5, 
     Junho= 6, Julho = 7, Agosto = 8, Setembro = 9, Outubro = 10, 
     Novembro = 11, Dezembro = 12}mes; 

    cin >> n; 
    mes = static_cast<meses>(n); 
    switch(mes) 
    { 
     case Janeiro: cout<<"janeiro"; break; 
     case Fevereiro: cout<<"fevereiro"; break; 
     case Marco: cout<<"marco"; break; 
     case Abril: cout<<"abril"; break; 
     case Maio: cout<<"maio"; break; 
     case Junho: cout<<"junho"; break; 
     case Julho: cout<<"julho"; break; 
     case Agosto: cout<<"agosto"; break; 
     case Setembro: cout<<"setembro"; break; 
     case Outubro: cout<<"outubro"; break; 
     case Novembro: cout<<"novembro"; break; 
     case Dezembro: cout<<"dezembro"; break; 
     default: cout<<"invalido"; break; 
    } 
    return 0; 
}  
Смежные вопросы