Задать вопрос
Dyikot
@Dyikot

Почему не получается вывести тип шаблона?

Есть следующий метод:
template<typename TOwner, typename T, typename TInput = T>
void SetProperty(BindableProperty<TOwner, T, TInput>& property, T& field, TInput value)
{
	// code
}


Если не указывать третий параметр при инициализации BindableProperty, то все ок, но есть переопределить третий, то нет. Приходится указывать явно.

Инициализация:
static inline BindableProperty<UIElement, std::reference_wrapper<const Cursor>, const Cursor&> CursorProperty =
	BindableProperty<UIElement, std::reference_wrapper<const Cursor>, const Cursor&>(&SetCursor, Cursors::Arrow);


И вот тут ошибка E0304:
void SetCursor(const Cursor& value) { SetProperty(CursorProperty, _cursor, value); } // E0304
const Cursor& GetCursor() const { return _cursor; }
  • Вопрос задан
  • 69 просмотров
Подписаться 1 Простой 17 комментариев
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Проблема в том, что TInput с одной стороны выводится из первого аргумента, там у вас BuildableProperty<...,...,const Cursor&> согласно определению CursorProperty.

Но третий аргумент выводит TInput как просто Cursor, потому что это аргумент функции, а там передача по ссылке, даже в шаблонах, должна быть указана явно. Cursor != Cursor&, это разные типы.

Один из способов это починить - в объявлении SetProperty:
SetProperty(..., typename std::remove_reference<TInput>::type value)


Теперь, даже если в первом аргументе в BuildProperty используются ссылки, они не будут мешать в третьем аргументе.

Но вообще, по уму вам бы ваш шаблон BuildableProperty пофиксить. Вот у вас для каких-то случаев надо в нем ссылки использовать. Так может ссылки имеет смысл использовать всегда? Тогда вы в шаблоне BuildableProperty предполагайте что T, TInput - это просто типы, без ссыльности и константности, и внутри где надо расставьте &.

Не надо для каких-то случаев "передавать" в шаблон ссылки на какие-то типы.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы