Can you give the output of clang? I've compiled horizon with clang 3.9.1 on Linux without errors.
Sure. It's actually an issue of libc++ vs libstdc++. I'd try the latter but the version of libstdc++ that ships with MacOS is now outdated and doesn't support C++14 features. What you get with libc++ is endless variation on the following theme:
In file included from pool/symbol.cpp:1:
In file included from pool/symbol.hpp:2:
In file included from util/uuid.hpp:8:
...
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/algorithm:627:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/utility:305:15: error: no viable overloaded '='
first = __p.first;
~~~~~ ^ ~~~~~~~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/map:650:15: note: in instantiation of member function
'std::__1::pair<const horizon::UUID, horizon::Text>::operator=' requested here
{__nc = __v.__cc; return *this;}
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__tree:1200:35: note: in instantiation of member function 'std::__1::__value_type<const
horizon::UUID, horizon::Text>::operator=' requested here
__cache->__value_ = *__first;
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__tree:1141:9: note: in instantiation of function template specialization
'std::__1::__tree<std::__1::__value_type<const horizon::UUID, horizon::Text>, std::__1::__map_value_compare<const horizon::UUID, std::__1::__value_type<const horizon::UUID, horizon::Text>,
std::__1::less<const horizon::UUID>, true>, std::__1::allocator<std::__1::__value_type<const horizon::UUID, horizon::Text> >
>::__assign_multi<std::__1::__tree_const_iterator<std::__1::__value_type<const horizon::UUID, horizon::Text>, std::__1::__tree_node<std::__1::__value_type<const horizon::UUID, horizon::Text>,
void *> *, long> >' requested here
__assign_multi(__t.begin(), __t.end());
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/map:928:21: note: in instantiation of member function
'std::__1::__tree<std::__1::__value_type<const horizon::UUID, horizon::Text>, std::__1::__map_value_compare<const horizon::UUID, std::__1::__value_type<const horizon::UUID, horizon::Text>,
std::__1::less<const horizon::UUID>, true>, std::__1::allocator<std::__1::__value_type<const horizon::UUID, horizon::Text> > >::operator=' requested here
__tree_ = __m.__tree_;
^
pool/symbol.cpp:142:9: note: in instantiation of member function 'std::__1::map<const horizon::UUID, horizon::Text, std::__1::less<const horizon::UUID>, std::__1::allocator<std::__1::pair<const
horizon::UUID, horizon::Text> > >::operator=' requested here
texts = sym.texts;
^
util/uuid.hpp:11:8: note: candidate function (the implicit copy assignment operator) not viable: 'this' argument has type 'const horizon::UUID', but method is not marked const
class UUID {
^
util/uuid.hpp:11:8: note: candidate function (the implicit move assignment operator) not viable: 'this' argument has type 'const horizon::UUID', but method is not marked const
This crops up anywhere you have something of the form
std::map<const UUID, T> because the key type is not assignable. I think this is a violation of the standard, and this person's argument is sound:
http://stackoverflow.com/questions/27221221/assignement-operator-requirement-for-key-type-in-stdmapHowever, note that I am not a C++ language lawyer and this is not legal advice! Mainly I can't think of any practical reason to do this, and it seems like just a gratuitous use of const. There were also similar issues that cropped up with with const UUID fields.
After liberal application of grep/sed I was able to
almost compile the code, but on discovering the missing GTK implementation I threw in the towel.