2017-10-14 6 views
0

このエラーは一般的ですが、私は4時間修正しようとしていて、なぜそれが発生するのか分かりません。エラー "shape.h" を与えるC2061 C++でエラーが発生しました

ファイル:私は "中" 方式で "クリエーター* [] c" を追加する前に

#ifndef __shape_atd__ 
#define __shape_atd__ 
#include <fstream> 
using namespace std; 
namespace simple_shapes { 
    class shape 
    { 
     public: 
      enum colors { Red, Orange, Yellow, Green, Blue, DarkBlue, Violet }; 
      colors color; 
      static shape* In(int lengt, Creator *c[], istringstream &ifst);   
      virtual void InData(istringstream &) = 0; 
      virtual void Out(ofstream &) = 0; 
      shape() {}; 
    } 

このすべてがうまく働きました。これでコンパイルが拒否され、エラーC2061:構文エラー:識別子 "Creator"が発生しました。ここで

は「Creator.h」ファイルです:

#ifndef __creator_atd__ 
#define __creator_atd__ 
namespace simple_shapes { 
    class Creator { 
    public: 
     virtual shape* createShape() = 0; 
    }; 
} 
#endif 

私は、このエラーが原因で、円形のヘッダの依存関係のoccuresが、私の場合、私はそれらを持っていないことを読みました。また、「Creator.h」は、その子を除いてプログラム内の他のファイルには記載されていません。

+3

をあなたは 'Creator'classためshape''の前方宣言を持っている必要があります。 – user0042

+2

なお、ダブルアンダースコアで始まる名前は、コンパイラ/標準ライブラリ用に予約されています。あなたのインクルードガードのためにそれらを使用しないでください。 –

+1

@ user0042 'shape'クラスの' Creator'で実際に前方宣言が助けになりました。 –

答えて

0

shape.hCreator.hに、またはshapeCreator.hにそれぞれ転送してください。たとえば - shape.h含むと

#ifndef __creator_atd__ 
#define __creator_atd__ 
namespace simple_shapes { 
    class shape; // forward declaration 
    class Creator { 
    public: 
     virtual shape* createShape() = 0; 
    }; 
} 
#endif 

別の例は以下のとおりである -

#ifndef __creator_atd__ 
#define __creator_atd__ 

#include "shape.h" 

namespace simple_shapes { 
    class Creator { 
    public: 
     virtual shape* createShape() = 0; 
    }; 
} 
#endif 
+0

私はフォワード宣言を追加した後、最終的にコンパイルして作業しましたが、これはできません。 'Creator'クラスの宣言を' shape.h'に追加しました。 –

+1

アイデアをありがとう、私はそれがC++のものだったことを完全に忘れてしまった... –

関連する問題