Проблема в том, что TInput с одной стороны выводится из первого аргумента, там у вас
BuildableProperty<...,...,const Cursor&>
согласно определению CursorProperty.
Но третий аргумент выводит TInput как просто Cursor, потому что это аргумент функции, а там передача по ссылке, даже в шаблонах, должна быть указана явно.
Cursor != Cursor&
, это разные типы.
Один из способов это починить - в объявлении SetProperty:
SetProperty(..., typename std::remove_reference<TInput>::type value)
Теперь, даже если в первом аргументе в BuildProperty используются ссылки, они не будут мешать в третьем аргументе.
Но вообще, по уму вам бы ваш шаблон BuildableProperty пофиксить. Вот у вас для каких-то случаев надо в нем ссылки использовать. Так может ссылки имеет смысл использовать всегда? Тогда вы в шаблоне BuildableProperty предполагайте что T, TInput - это просто типы, без ссыльности и константности, и внутри где надо расставьте &.
Не надо для каких-то случаев "передавать" в шаблон ссылки на какие-то типы.