2012-06-21 2 views
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 생성자C++ 예상 기본 표현식 컴파일 오류

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

나에게 오류를 제공합니다. 어쩌면보기와 제안이 명확할까요? 긴 목록은 유감스럽게 생각합니다. 편집 : 답변은 auto method = instance -> template add_object<T>;입니다. 왜 당신은 당신의 대답을 삭제 했습니까?

+0

'auto method = instance-> add_object ;에 괄호가 없습니다. 그럴 수도 있습니다. – chris

+0

아니요. 메소드에 대한 포인터를 가져오고 싶습니다. – KAction

+0

'auto'를 성명으로 대체하면 오, 작동합니까? – chris

답변

2

멤버 함수에 대한 포인터를 얻으려면 다른 대답의 구문을 따라야합니다.

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

그렇지 않으면 C++이보다 적게보다는 및 연산자보다 큼으로 add_object<T>에 뾰족한 괄호를 구문 분석 :

멤버 함수는 또한 템플릿이기 때문에

, 당신이 그것을 종속 이름 때문에 표시해야합니다.

2
struct declare_object 
    { 
    declare_object() { 
     auto instance = library<type>::instance(); 
     auto method = &library<type>::template add_object<T>; 
     (instance->*method)(); 
    } 
    }; 
+0

+1, 예, 여분의 괄호 ... – jxh

+1

(예 : – moonshadow