2016-05-09 24 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; 
}  

コンパイルエラーがある: "メイン():: mesesにint型から無効な変換"。

+1

質問を投稿するときは、コンパイラの出力を追加してくださいので、我々はあなたが – ddeunagomez

+0

@QualityCatalyst 'mes'を取得しているエラーを知っています'enum meses'で始まる行に定義されています。 – immibis

+1

@ excalibur1491 OK、今編集してコンパイラエラーを追加しました。私はここで新しいので、助言に感謝します。 –

答えて

3

標準C++では、暗黙の変換はありませんenumタイプです。したがって、単にmes = n;と書くことはできません。例えば、あなたが明示的に行う必要があり、この変換を行うには:

mes = static_cast<meses>(n); 

はしかし、intに、スコープ外enumから暗黙の型変換があります。 (技術的には整数昇格です)。だから、あなたがキャストを必要としない:だから

int x = Janeiro; 

、あなたの問題の別の解決策は、入力された値を格納するためintを使用することです。スコープを持たない列挙子を整数型に推進するため

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

上記のように、何のキャストがcase Janeiroのために必要とされない:実際には、あなたはすでにその役割を果たしnを持っています。

INT_MAXより大きい列挙子がある場合は、技術的には、intの代わりにstd::underlying_type<meses>::typeを使用する必要があります。

変換の両方向(enumからint、およびenumへの列挙)に必要なキャストが必要な場合は、スコープの列挙を使用する必要があります。enum class meses

あなただけ switch(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; 
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はenum型の 'mes'という変数を作成しようとしていたと思います。構文は間違っているわけではありません。enumは再利用できません(ただし、それが必要な場合は何も問題ありません)。 "meses mes = n;":10:13:error: 'int'から 'main():: meses'への無効な変換[-fpermissive]そして、あなたのソリューションはコンパイルされません(標準C++) ' – 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)mesと呼ばれるタイプenum mesesの変数を作成します。列挙型は、その変数に対してここで一度しか使用できません。 2)列挙型を作成し、次に変数を作成します。この方法で、その列挙型のインスタンスを複数作成することができます。 3)typedefを使用して名前を短縮します(非常に便利ではありませんが、構造体の方がenumの方が面白いです)。

最後に、enum型の変数にint型を入れるには、into型をenum型にキャストする必要があります。 C++は、これらのものを全く異なるオブジェクトと考えています(enumは結局intの束です)。

+1

一般的な原則として、間違いの危険性が少ないので、C++スタイルのキャスト、すなわち' mes = static_cast (n); 'を使うことをお勧めします。あなたのバージョン3は、理由なしで言葉を追加します。 –

+0

あなたはキャストに合っています。 (3番目のバージョンはtypedefの使用を示していましたが、OPで使用されている構文は、それが彼の意図だったかもしれないと思っていましたが、typedefキーワードを忘れてしまったと思いました) – ddeunagomez

0

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; 
}  
関連する問題