diff --git a/cppwinrt/code_writers.h b/cppwinrt/code_writers.h index 72907b317..01f7dea10 100644 --- a/cppwinrt/code_writers.h +++ b/cppwinrt/code_writers.h @@ -1137,7 +1137,7 @@ namespace cppwinrt {% if constexpr (!std::is_same_v) { - auto const& [castedResult, code] = static_cast(this)->template try_as_with_reason<%>(); + auto const [castedResult, code] = impl::try_as_with_reason<%, D const*>(static_cast(this)); check_hresult(code); auto const abiType = *(abi_t<%>**)&castedResult; abiType->%(%); @@ -1156,7 +1156,7 @@ namespace cppwinrt {% if constexpr (!std::is_same_v) { - auto const& [castedResult, code] = static_cast(this)->template try_as_with_reason<%>(); + auto const [castedResult, code] = impl::try_as_with_reason<%, D const*>(static_cast(this)); check_hresult(code); auto const abiType = *(abi_t<%>**)&castedResult; WINRT_VERIFY_(0, abiType->%(%)); @@ -1176,7 +1176,7 @@ namespace cppwinrt {% if constexpr (!std::is_same_v) { - auto const& [castedResult, code] = static_cast(this)->template try_as_with_reason<%>(); + auto const [castedResult, code] = impl::try_as_with_reason<%, D const*>(static_cast(this)); check_hresult(code); auto const abiType = *(abi_t<%>**)&castedResult; check_hresult(abiType->%(%)); diff --git a/strings/base_implements.h b/strings/base_implements.h index 4bd60e5f0..0847f5019 100644 --- a/strings/base_implements.h +++ b/strings/base_implements.h @@ -788,19 +788,24 @@ namespace winrt::impl return m_inner.try_as(); } - template - auto try_as_with_reason() const noexcept - { - return m_inner.try_as_with_reason(); - } - explicit operator bool() const noexcept { return m_inner.operator bool(); } + + template + friend auto winrt::impl::try_as_with_reason(From ptr) noexcept; + protected: static constexpr bool is_composing = true; Windows::Foundation::IInspectable m_inner; + + private: + template + auto try_as_with_reason() const noexcept + { + return m_inner.try_as_with_reason(); + } }; template diff --git a/strings/base_windows.h b/strings/base_windows.h index 6fa2e17d0..a67ef0b20 100644 --- a/strings/base_windows.h +++ b/strings/base_windows.h @@ -148,6 +148,12 @@ namespace winrt::impl hresult code = ptr->QueryInterface(guid_of(), &result); return { wrap_as_result(result), code }; } + + template + auto try_as_with_reason(From ptr) noexcept + { + return ptr->template try_as_with_reason(); + } } WINRT_EXPORT namespace winrt::Windows::Foundation