У меня есть следующий код C ++ / CX, который работает так, как задумано, но хотел бы преобразовать его в код C ++ / WinRT:
namespace My.Custom.Stuff
{
[Windows::Foundation::Metadata::WebHostHidden]
public ref class BaseClass : public Windows::UI::Xaml::Controls::SwapChainPanel
{
public:
BaseClass();
void PublicMethod();
protected:
static ::DirectX::XMFLOAT3 ProtectedMethod();
};
}
namespace My.Custom.Stuff
{
[Windows::Foundation::Metadata::WebHostHidden]
public ref class SubClass sealed : public BaseClass
{
public:
SubClass();
void UseProtectedMethod()
{
::DirectX::XMFLOAT3 value = ProtectedMethod()
// ...
}
};
}
Однако проблема, с которой я сталкиваюсь, заключается в следующем: BaseClass
содержит защищенный метод, который возвращает тип, который не может быть сопоставлен с соответствующим типом среды выполнения Windows. В C ++ / CX это не проблема, потому что ProtectedMethod
вообще не отображается. Если я использую свой компонент среды выполнения Windows, ProtectedMethod
просто не отображается, чего я хочу.
Однако этот метод должен быть членом BaseClass
, потому что несколько других классов, таких как SubClass
, используют этот метод при реализации своих общедоступных методов. Я придумал следующий код MIDL на C ++ / WinRT:
namespace My.Custom.Stuff
{
unsealed runtimeclass BaseClass : Windows.UI.Xaml.Controls.SwapChainPanel
{
BaseClass();
void PublicMethod();
// This does not work
protected DirectX.XMFLOAT3 RgbFromBrush(IInspectable brush);
}
}
import "BaseClass.idl";
namespace My.Custom.Stuff
{
runtimeclass SubClass : BaseClass
{
SubClass();
void UseProtectedMethod();
}
}
Проблема в том, что если я определю ProtectedMethod
таким образом, это не сработает, потому что ::DirectX::XMFLOAT3
не относится к типу среды выполнения Windows. Если я использую любой другой тип возвращаемого значения, этот защищенный метод будет отображен. Однако он не должен быть виден при использовании этого компонента среды выполнения Windows, и, конечно же, мне не придется менять его возвращаемый тип.
Как я могу добиться того, что я делаю с C ++ / CX, используя C ++ / WinRT?
Изменить
При компиляции кода MIDL получается что-то вроде этого:
#include "BaseClass.g.h"
namespace winrt::My::Custom::Stuff::implementation
{
struct BaseClass : BaseClassT<BaseClass>
{
BaseClass() = default;
// ...
};
}
namespace winrt::My::Custom::Stuff::factory_implementation
{
struct BaseClass : BaseClassT<BaseClass, implementation::BaseClass>
{
};
}
Я подумал, что можно просто добавить защищенный метод следующим образом:
namespace winrt::My::Custom::Stuff::implementation
{
struct BaseClass : BaseClassT<BaseClass>
{
BaseClass() = default;
protected:
static ::DirectX::XMFLOAT3 ProtectedMethod();
};
}
Однако попытка использовать ProtectedMethod
в SubClass
приводит к следующей ошибке:
error C2039: 'ProtectedMethod': is not a member of 'winrt::My::Custom::Stuff::BaseClass'
Вот как я его использую:
#include "SubClass.g.h"
namespace winrt::My::Custom::Stuff::implementation
{
struct SubClass : SubClassT<SubClass>
{
SubClass() = default;
void UseProtectedMethod()
{
::DirectX::XMFLOAT3 value = ProtectedMethod();
}
};
}
namespace winrt::My::Custom::Stuff::factory_implementation
{
struct SubClass : SubClassT<SubClass, implementation::SubClass>
{
};
}
SubClass
может его найти. Я добавил дополнительные пояснения к своему вопросу. Из того, что я вижу в опубликованном сообщении об ошибке, это несоответствие пространств имен. Я добавляю метод в пространство имен * :: implementation, но он ищет метод вне его. - person ackh   schedule 30.11.2020ProtectedMethod()
в BaseClass - это правильно. Я пробую путь на своей стороне, иProtectedMethod()
может быть успешно вызван вUseProtectedMethod()
изSubClass
. Не могли бы вы предоставить нам код звонкаProtectedMethod()
для тестирования? Я используюProtectedMethod()
вSubClass
вот так:void SubClass::UseProtectedMethod()
{ ProtectedMethod(); }
И вызываюSubClass.UseProtectedMethod()
так:SubClass sc;
sc.UseProtectedMethod();
- person YanGu   schedule 01.12.2020My::Custom::Stuff
). Однако это интуиция, и я не знаю, что именно искать. - person ackh   schedule 01.12.2020struct BaseImpl { protected: ::DirectX::XMFLOAT3 ProtectedMethod(); }; struct BaseClass : BaseClassT<BaseClass>, BaseImpl { ... }; struct SubClass : SubClassT<SubClass>, BaseImpl { ... }
. - person Raymond Chen   schedule 02.12.2020SubClass
просто не может найтиBaseImpl
, хотя оба они определены в пространстве именwinrt::My::Custom::Stuff::implementation
. У вас есть полный рабочий пример? - person ackh   schedule 02.12.2020