更新:
根据 Ryan Shepherd 的回复,我将代码更改为:
class DerivedClass : winrt::implements<DerivedClass, BaseClass> {
public:
DerivedClass(winrt::FrameworkElement& control) :
5===>implements_type(control) {}
static winrt::com_ptr<DerivedClass> from(winrt::FrameworkElement control) {
control ? control.Tag().try_as<SvgCanvasController>() : nullptr;
}
}
现在我得到一个错误:
没有构造函数实例 "winrt::implements<D, I, ...>::implements [with D=DerivedClass, I=BaseClass]" 匹配参数列表参数类型是:(winrt::Windows::UI:: Xaml::FrameworkElement)。
我确实定义了 BaseClass 构造函数,它将 &FrameworkElement 作为参数。所以我不确定我得到这个错误是什么。
原文:
我在 C++/CX 中有这个:
ref class DerivedClass sealed : public BaseClass {
public:
explicit DerivedClass(Windows::UI::Xaml::FrameworkElement^ &control)
: BaseClass(control) {}
static DerivedClass from(Windows::UI::Xaml::FrameworkElement^ control) {
return control ? dynamic_cast<DerivedClass>(control->Tag) : nullptr;
}
}
当我尝试将其转换为 c++/winrt
class DerivedClass : winrt::implements<DerivedClass, BaseClass> {
public:
1===>DerivedClass(winrt::FrameworkElement& control) : BaseClass(control)
2===>{
}
static DerivedClass from(winrt::FrameworkElement control) {
if (control)
3===> return control.Tag().try_as<SvgCanvasController>();
else
4===> return nullptr;
}
这里有几个问题我想讨论和理解。如上所述,我收到以下错误:
1
BaseClass 不是 DerivedClass 类的非静态数据成员或基类
2
winrt::implements<DerivedClass, BaseClass> 的默认构造函数不能被引用——它是一个被删除的函数
3
没有合适的用户定义从 winrt::impl::com_ref<DerivedClass> 到 DerivedClass 的转换
4
不存在从 std::nullptr_t 转换为 DerivedClass 的合适构造函数
希望对这些错误有一些想法。
我知道我创建了一个 DerivedClass 对象
auto obj = winrt::make<DerivedClass>();
问题:
- 如何正确编写构造函数?
- 如何像在 C++/CX 中那样将参数传递给基类构造函数?
- 如何处理 from() 函数定义中的错误。