0
#include <boost/format.hpp>
#include <boost/scoped_ptr.hpp>
#include <stdexcept>
#include <unordered_map>
#include <functional>
#define DECLARE_OBJECT(classname) namespace {core::declare_object<classname> __declarartion_#classname;}

namespace core {
  class dungeon;
  class object;
  typedef  std::function<object* (dungeon *)> object_creator;
  namespace  library_type {
    enum type {
      landscape = 0, walker, foe, bonus,object = 42
    };
  };
  struct library_error : public std::logic_error 
  {
    explicit library_error(const std::string &what) : std::logic_error(what) {};
  };
  template <enum  library_type::type type>
  class library {
  public:
    static library<type> *instance() {
      if (!m_instance)
        m_instance = new library<type>();
      return m_instance;
    }
    template<typename T>
    void add_object() {
      boost::scoped_ptr<T> obj(T::create(nullptr));
      m_library.insert(obj->name(), T::create);
    }
    const object_creator& get_object(const std::string &key) {
      auto lookup_iterator = m_library.find(key);
      if (lookup_iterator == m_library.end())
        throw library_error(boost::format("Object creator for key `%1%' not found\n") % key);
      return *lookup_iterator;
    }
  private:
    library () {};
    static library<type> *m_instance;
    std::unordered_map<std::string, object_creator> m_library;
  };
  template <enum library_type::type type>
  library<type>*  library<type>::m_instance;
  template <enum  library_type::type type, typename T>
  struct declare_object
  {
    declare_object() {
      auto instance = library<type>::instance();
      auto method = instance->add_object<T>;
      method();
    }
  };
};
int main()
{

}

こんにちは。この単純なC++0xコードは、declare_objectコンストラクターでエラーを発生させます

example.cpp: In constructor ‘core::declare_object<type, T>::declare_object()’:
example.cpp:52:43: error: expected primary-expression before ‘&gt;’ token
example.cpp:52:44: error: expected primary-expression before ‘;’ token

どこが間違っているのか本当にわかりません。多分明確な見解と提案?長いリストでごめんなさい。編集:答えはでしたauto method = instance -> template add_object<T>;。なぜあなたはあなたの答えを削除したのですか?

4

2 に答える 2

2

メンバー関数へのポインターを取得するには、他の回答の構文に従う必要があります。

メンバー関数はさらにテンプレートであるため、依存する名前であるため、これを示す必要があります。

auto method = &library_type<type>::template add_object<T>;

それ以外の場合、C++は先のとがった中括弧を小add_object<T>なり演算子および大なり演算子として解析します。

于 2012-06-21T16:07:47.450 に答える
2
  struct declare_object
  {
    declare_object() {
      auto instance = library<type>::instance();
      auto method = &library<type>::template add_object<T>;
      (instance->*method)();
    }
  };
于 2012-06-21T15:42:32.877 に答える