如何在 idl 3.0 中声明嵌套模板

How to declare nested templates in idl 3.0

我希望这是一个基本问题,但我在 MSDN 或整个 Internet 上找不到任何文档或示例,但一直没有成功。

我正在用 C++/WinRT 实现一个 windows 运行时组件。我有一个异步方法扫描是否存在特定类型的设备和 returns 找到的设备的字符串(设备 ID)向量。该函数的 C++ 签名是:

static IAsyncOperation<IVector<winrt::hstring>> ScanInterfacesAsync();

我未能成功编写将此函数投射到运行时的 IDL。我的最佳猜测:

static IAsyncOperation<IVector<String>> ScanInterfacesAsync();

失败并出现错误:

error MIDL2025: [msg]syntax error [context]: expecting > or , near ">>"

我已经尝试了一些其他的东西,但我可以说我根本不理解 IDL 如何与模板一起工作。而且我在任何在线 IDL 文档中都找不到模板化 return 类型的任何示例。

这可能吗?什么是正确的语法?任何指向我忽略的文档的指针?谢谢

错误消息似乎表明 MIDL 3.0 uses a greedy parser. It interprets the two consecutive closing angle brackets (>) as a single right-shift operator (>>), much like C++ did prior to C++11 (see right angle bracket).

要解决此问题,MIDL 3.0 源代码需要在连续的右尖括号之间引入任意白色 space(例如单个 space 字符),以便将其解释为两个不同的标记反对单一的令牌。应编译以下内容:

static IAsyncOperation<IVector<String> > ScanInterfacesAsync();