C++/WinRT使用implements_type初始化投影类型基类出现C2664编译错误
问题原因与解决方案
1. 编译报错的根本原因
你对winrt::implements的继承逻辑理解有误,才会触发参数不匹配的编译错误:
- 当你直接将
Velkhana::Only作为winrt::implements的第二个模板参数时,winrt::implements只会将其视作普通WinRT接口来实现,不会把它当做可继承的 unsealed 运行时类处理。implements_type是winrt::implements本身的别名,它本身只提供默认构造、拷贝构造、移动构造三类隐式构造函数,根本没有接收IInspectable类型参数的重载,你传入box_value返回的对象自然会报类型转换错误。
2. unsealed运行时类的正确继承与初始化方法
winrt::implements本身只负责WinRT接口的基础实现逻辑,本身不提供对接 unsealed 运行时类构造的逻辑,你找不到对应的构造函数是正常的。
要实现从自定义unsealed运行时类派生,需要使用C++/WinRT提供的winrt::extends标记声明继承关系,修改你的实现类代码如下即可:
class Only2 : public winrt::implements<Only2, winrt::extends<Velkhana::Only>> { public: // 此处base_type会自动关联到Velkhana::Only的构造,直接传参即可 Only2() : base_type(winrt::box_value(true)) { } // 此处补充你要实现的自定义逻辑、基类要求的抽象成员等 };
当你使用winrt::extends<Velkhana::Only>声明继承后,模板会自动生成可转发参数的基类构造逻辑,你不需要额外的特殊技巧就能完成父类初始化。
内容的提问来源于stack exchange,提问作者junwufan
相关产品推荐
相关产品推荐

