1

http://www.drdobbs.com/embedded-systems/225700666をマイクロプロセッサKeil MDK用に移植していARMます。gccフレームワークは、デスクトップで使用すると正常にコンパイルおよび動作しますが、Keilコンパイラを使用するとエラーが発生します。

logging/singleton.h(65): error: #70: incomplete type is not allowed

singleton次のコードは、このエラーが発生する場所の実装を示しています。このエラーはどこから発生しますか?

namespace logging {

  namespace detail {

      template <typename T>
      class singleton
      {
        private:
          struct obj
          {
            obj() { singleton<T>::instance(); }
            inline void empty() const { }
          };
          static obj __obj;

          singleton();

        public:
          typedef T obj_type;

          static obj_type & instance()
          {
            static obj_type obj;  // <-- Here I get this error

            __obj.empty();

            return obj;
          }
      };
      template <typename T>
      typename singleton<T>::obj
      singleton<T>::__obj;

  } /* detail */
} /* logging */

編集:singletonここでインスタンス化されます

template <typename log_t, typename T>
struct Obj {
    static return_type& obj () {
        typedef singleton<return_type> log_output;
        return log_output::instance();
    }
}; 

return_typetypedefはどこにありますか?

typedef R return_type;

これは親テンプレートのパラメータです。

template<typename Level = ::logging::Void, typename R = loggingReturnType>
    class Logger {
       ...
    };

loggingReturnTypeクラス定義の上で前方宣言されます:

struct loggingReturnType;

編集2:これloggingReturnTypeは次のマクロを通じて生成されます。

#define LOGGING_DEFINE_OUTPUT(BASE)                                           \
namespace logging {                                                           \
    struct loggingReturnType : public BASE {                                  \
            /*! \brief The provided typedef is used for compile time          \
             *         selection of different implementation of the           \
             *         %logging framework. Thus, it is necessary              \
             *         that any output type supports this type                \
             *         definition, why it is defined here.                    \
             */                                                               \
            typedef BASE    output_base_type;                                 \
        };                                                                    \
}

このマクロは、構成ヘッダーで呼び出されます。

編集3:彼女はプリプロセッサ出力へのリンクです:http://www.pasteall.org/31617/cpp。このファイルは、を使用してかなりコンパイルされますg++。の定義は-loggingReturnTypeの前の最後ですmain。したがって、シングルトンは正確なタイプではありませんが、それでも機能します。Keilコンパイラのプリプロセッサ出力も調べましたが、ほとんど同じです。

では、ここで何がうまくいかなかったのでしょうか。

4

1 に答える 1

3

ここに入力した情報によると、エラーメッセージは完全に理にかなっています。コードは、スタック上にオブジェクトのインスタンスを作成しようとしています。このオブジェクトの型は前方宣言されているだけですが、その時点でコンパイラーは定義を使用できません。

このタイプのインスタンスを作成する前に、コンパイラがこのタイプの定義を使用できるようにする必要があります。

于 2012-05-06T11:41:13.813 に答える