为什么这个代码会在MSVC中构建而不是在Clang中构建?

时间:2015-05-01 10:24:00

标签: c++ xcode templates c++11 clang

如何使用OS X 10.10.3附带的XCode / Clang构建此代码?

// A template class for a property that calls a function on property_value_changed
template <typename T, typename V = void>
class PROPERTY_WITH_LISTENER_FUNCTION : public T
{
    class LISTENER_FUNCTION : public PROPERTY_LISTENER
    {
        std::function<void(V)> m_function;

    public:
        LISTENER_FUNCTION(std::function<void(V)> function)
            : m_function(std::move(function)) {}

        template <typename V2> void do_call(const PROPERTY &p)
        {
            m_function(p.get<V2>());
        }

        template <> void do_call<void>(const PROPERTY &)  // <=== Error here
        {
            m_function();
        }

        virtual void property_value_changed(const UTILITYDLL::PROPERTY &p)
        {
            if(m_function) do_call<V>(p);
        }
    };

    LISTENER_FUNCTION m_listener;

public:
    template <typename... ARGS>
    PROPERTY_WITH_LISTENER_FUNCTION(const String &name,
                                    std::function<void(V)> function,
                                    ARGS&&... args)
        : T(name, std::forward<ARGS>(args)...)
        , m_listener(std::move(function))
    {
        add_listener(m_listener);
    }

    virtual ~PROPERTY_WITH_LISTENER_FUNCTION()
    {
        remove_listener(m_listener);
    }
};

它在MSVC 2013中构建得很好,但是使用XCode / Clang我得到了错误

PropertySet.h:1171:9: error: cannot specialize a function 'do_call' within class scope
void do_call<void>(const PROPERTY &);
     ^

没有多少杂耍似乎能够说服Clang去做它所说的话。任何人都可以提出编译版本吗?

0 个答案:

没有答案
相关问题