C ++ уведомление Windows: использование имени зависимого шаблона - PullRequest
0 голосов
/ 02 сентября 2018

В настоящее время я пытаюсь создать обратный вызов для родного уведомления 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, или они недавно что-то изменили, и я должен скорректировать свой код.

Спасибо за предложения.

1 Ответ

0 голосов
/ 03 сентября 2018

Как указывало @ Evg , они, вероятно, внесли некоторые изменения, и теперь для зависимых шаблонов требуется ключевое слово template.

Если кому-то интересно, это новый код в event.h, который, кажется, работает:

// 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::template 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::template Callback<TDelegateInterface, typename DelegateHelper::Interface>(
    [=](auto&& ...args)
    {
        return callback(Details::Forward<decltype(args)>(args)...);
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...