3

.c ファイルを .cpp ファイルに変換する必要があり、次の宣言に遭遇しました。

 typedef void handler_t(int);

 handler_t *Signal(int signum, handler_t *handler);

この 2 行のコードをヘッダー ファイルに含め、実際の関数宣言関数を .cpp ファイルに追加します。

 handler_t *Signal(int signum, handler_t *handler){ ...... } 

これを行うと、「handler_t は型に名前を付けていません」というエラーが表示されます。C または C++ で typdef を使用したことがないので、なぜエラーが発生するのか説明してもらえますか?


リクエストされた私のクラス:

 #ifndef A_H
 #define A_H

 class A
 {
     public:
       A();
       virtual ~A();

       typedef void handler_t(int);
       handler_t* Signal(int signum, handler_t *handler);

     protected:
     private:
 };

   #endif // A_H

/////////////

   #include "A.h"

   A::A()
   {
   }

   A::~A()
   {
   }

   handler_t* A::Signal(int signum, handler_t *handler) {

     ...........

    }

エラー:

    |694|error: ‘handler_t’ does not name a type|
4

2 に答える 2

2

次のように変更してみてください。

typedef void (*handler_t)(int);

と:

handler_t Signal(int signum, handler_t handler);

参考signal()までに、次のように機能するものを確認してください。

#include <signal.h>

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

実際、あなたの新しいコードを見て、私はあなたがこれをしなければならないと思います:

A::handler_t* A::Signal(int signum, A::handler_t *handler)

あなたの新しいエラー「メインへの未定義の参照」は、尋ねられた質問とは無関係だと思います。いくつかのアイデアについては、この投稿を参照してください。

于 2013-03-17T00:24:51.243 に答える
0
handler_t* A::Signal(int signum, handler_t *handler) {

問題は、最初の言及はhandler_tで修飾する必要があるということA::です。このような:

A::handler_t* A::Signal(int signum, handler_t *handler) {

これは、クラス内で定義された型がメンバー関数の戻り型として使用される場合に常に当てはまります。関数を宣言すると、クラス定義内にいるため、ネストされたtypedefがわかります。また、クラス定義内で関数を定義する場合も同じです。ただし、クラス定義の外に出たら、どこhandler_tで定義されているかをコンパイラに通知する必要があります。しかし、2番目の言及handler_tは問題ありません。その時点で、コンパイラーは、のメンバー関数をコンパイルしていることをA認識しており、のネストされた型について認識しているからAです。

于 2013-03-17T00:57:14.170 に答える