2011-03-03 14 views
2

私がこれにどのようにしたかの概要。構造た.cppファイルI「はと受信エラー エラーが発生しました ';'前例。

を作るファイル

  • 蘭作るを作成するために、CMakeのを使用し
  • を作成し
  • 作成さ

    1. 次のコードをコンパイルしようとしています:

      #include <iostream> 
      using namespace std; 
      
      enum UnitType { Meter, Inch }; 
      class Meter { 
          double value; 
      
          public: 
           Meter(double value) : value(value) {} 
           double convertTo(UnitType unit) { 
            if (unit == Inch) { 
             return value * 39.3700787; 
            } 
           }; 
      }; 
      
      int main (int argc, char *argv[]) 
      { 
          try 
          { 
           Meter meter(1.0); 
          } 
          catch (int e) { 
           cout << "exception " << e << endl; 
          } 
      
          return 0; 
      } 
      

      しかし、私は次のエラーを受信して​​います:

       
      $ make 
      [100%] Building CXX object CMakeFiles/convert-length.dir/convert-length.cpp.o 
      /convert/length/convert-length.cpp: In function ‘int main(int, char**)’:          
      /convert/length/convert-length.cpp:27: error: expected ‘;’ before ‘meter’ 
      make[2]: *** [CMakeFiles/convert-length.dir/convert-length.cpp.o] Error 1 
      make[1]: *** [CMakeFiles/convert-length.dir/all] Error 2 
      make: *** [all] Error 2 
      

      私はこれは私が欠けているどこかの愚かなC++構文エラーで望んでいるが、私はカップルの時間を費やしてきましたそれは成功なしで探しています。私はC++の経験はほとんどありませんが、このコードは構文的に正しいと思われます。誰かが何が間違っているかを知っていますか?

  • +1

    を、あなたは '必要はありません。 – Muggen

    +0

    'try'ブロック内のコードは例外をスローすることはできません(ライブラリ関数を呼び出さず、動的割り当てを行わず、コードから例外がスローされません) 。 'try'と' catch 'ブロックはまったく必要ありません。 –

    答えて

    6
    enum UnitType { Meter, Inch }; 
    

    あなたは列挙値としてMeterを定義しました。

    class Meter { 
    

    ...しかし、ここであなたはクラスの名前としてそれを再定義しようとしている(同じ範囲で)。だけではなく Meterの、それは 、法的だがはあなたが class Meterを使用する必要があり、後でそれを利用するために:

    class Meter meter(1.0); 
    

    IMO、あなたが両方に同じ名前を使用することができるにもかかわらず、それがつながる可能性が高いです混乱や問題は、どちらか一方(あるいは両方)の名前を変更するだけで、はるかにうまく回避できます。

    +0

    もっと楽しい名前のために、 'class Meter Meter(1.0);'! –

    +0

    @James McNellis:もしあなたがそのような言語を使い続けているのであれば、あなたの口は石けんで洗い流さなければならなくなります。それから次の数年の間に= else else = endif endif'を実行します。ああ、あなたはC#を書いています - Fortranがもっと楽しいかもしれません。 –

    0

    名前の変更のどちらかあなたの列挙型のメンバー「メーター」やクラス名「メーター」

    1

    1. convertTo方法は、すべてのコードパス
    2. に戻らないこのサンプルを読んで私に飛び出した物事のカップル
    3. convertToの方法は、}の終了後に;です。
    4. 識別子Meterが列挙値とクラス名の2回表示されます。ここで
    0

    enumの "Meter"がクラス名 "Meter"と競合するため、何かに変更してください。

    第2に、 "unit!= Inch"の場合、関数 "convertTo"の戻り値を追加する必要があります。

    0

    クラス名がMeterであっても、列挙型をMETERとINCHに変更します。

    +0

    すべての大文字を使用すると、伝統的にすべて大文字のプリプロセッサマクロに問題が発生することがあります。 –

    1

    誰もが指摘しているとおり、Meterは列挙型でもクラス名でもあります。

    同じ名前維持することを可能にする小さなトリック:; ``決算上の `} convertTo``に

    class UnitType 
    { 
        public: 
         enum UnitType { Meter, Inch }; 
    }; 
    
    
    int main() 
    { 
        // Meter enum is now inside the scope of UnitType 
    
        UnitType::UnitType type = UnitType::Meter; 
        Meter    meter(1.0); 
    
    } 
    
    関連する問題