1

我将http://www.drdobbs.com/embedded-systems/225700666移植到微处理器Keil MDKARM该框架可以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是通过以下 makro 生成的。

#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;                                 \
        };                                                                    \
}

这个 makro 在配置头中被调用。

编辑 3:她是预处理器输出的链接:http: //www.pasteall.org/31617/cpp。该文件使用g++. 的定义loggingReturnType是 - 之前的最后一个,main所以单例不是确切的类型,但它仍然有效。我还查看了Keil编译器的预处理器输出,几乎是一样的。

那么这里出了什么问题呢?

4

1 回答 1

3

根据您在此处输入的信息,错误消息非常有意义。该代码试图在堆栈上创建一个对象的实例。该对象的类型只是前向声明的,但当时编译器没有可用的定义。

在必须创建此类型的实例之前,您需要使编译器可以使用此类型的定义。

于 2012-05-06T11:41:13.813 回答