В настоящее время я пытаюсь создать обратный вызов для родного уведомления Windows 10. Мой код для добавления уведомления выглядит следующим образом:
notification->add_Dismissed(
Callback<Implements<RuntimeClassFlags<ClassicCom>,
ITypedEventHandler<ToastNotification*, ToastDismissedEventArgs*>>>(
[eventHandler, expirationTime](IToastNotification*, IToastDismissedEventArgs* e) {
ToastDismissalReason reason;
if (SUCCEEDED(e->get_Reason(&reason))) {
if (reason == ToastDismissalReason_UserCanceled &&
expirationTime &&
MyDateTime::Now() >= expirationTime
){
reason = ToastDismissalReason_TimedOut;
}
eventHandler->toastDismissed(static_cast<IWinToastHandler::WinToastDismissalReason>(reason));
}
return S_OK;
}).Get(), &dismissedToken);
Где notification
- это IToastNotification*
, а eventHandler
- мой класс обработчика.
Однако со времени последнего обновления Visual Studio я получаю следующие ошибки:
c:\program files (x86)\windows kits\10\include\10.0.17134.0\winrt\wrl\event.h(316): error C7510: 'Callback': use of dependent template name must be prefixed with 'template'
c:\program files (x86)\windows kits\10\include\10.0.17134.0\winrt\wrl\event.h(324): error C7510: 'Callback': use of dependent template name must be prefixed with 'template'
Следует за кодом, на который ссылаются сообщения об ошибках:
// Construct a COM/WinRT delegate (an object with an Invoke() method) from a lambda.
// Check the return from this function for null to detect out of memory (E_OUTOFMEMORY) failure case.
template<typename TDelegateInterface, typename TLambda>
ComPtr<typename Details::DelegateArgTraitsHelper<TDelegateInterface>::Interface> Callback(TLambda&& callback) throw()
{
using DelegateHelper = Details::DelegateArgTraitsHelper<TDelegateInterface>;
return DelegateHelper::Traits::Callback<TDelegateInterface, typename DelegateHelper::Interface>(Details::Forward<TLambda>(callback));
}
// Construct a COM/WinRT delegate, an object with an Invoke() method, from a raw function.
template<typename TDelegateInterface, typename TFunc> ComPtr<typename Details::DelegateArgTraitsHelper<TDelegateInterface>::Interface> Callback(_In_ TFunc* callback) throw()
{
using DelegateHelper = Details::DelegateArgTraitsHelper<TDelegateInterface>;
return DelegateHelper::Traits::Callback<TDelegateInterface, typename DelegateHelper::Interface>(
[=](auto&& ...args) {
return callback(Details::Forward<decltype(args)>(args)...);
});
}
Честно говоря, я понимаю, что не так. Со времени последнего обновления этот конкретный код работал (насколько я знаю). Не могли бы вы указать мне решение?
Я понимаю, что это как-то связано с зависимыми именами шаблонов. Но я не знаю, какая часть кода неправильная - если это какая-то опечатка в winrt
, или они недавно что-то изменили, и я должен скорректировать свой код.
Спасибо за предложения.