Как объявить вложенные шаблоны в idl 3.0

У меня есть, надеюсь, основной вопрос, но мне не удалось найти какую-либо документацию или примеры в MSDN или в Интернете в целом.

Я реализую компонент среды выполнения Windows на C++/WinRT. У меня есть асинхронный метод, который сканирует наличие определенного типа устройства и возвращает вектор строк (идентификаторов устройств) найденных устройств. Сигнатура C++ функции:

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

Мне не удалось получить разработку IDL, которая проецирует эту функцию в среду выполнения. Мое лучшее предположение:

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

Вылетает с ошибкой:

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

Я пробовал еще несколько вещей, но могу сказать, что просто принципиально не понимаю, как IDL работает с шаблонами. И я не могу найти примеров шаблонного возвращаемого типа ни в одной онлайн-документации по IDL.

Это возможно? Какой правильный синтаксис? Любые указатели на документацию, которую я пропустил? Спасибо.


person Sean Kelly    schedule 28.11.2018    source источник


Ответы (1)


Сообщение об ошибке указывает на то, что MIDL 3.0 использует жадный парсер. Он интерпретирует две последовательные закрывающие угловые скобки (>) как один оператор сдвига вправо (>>), как это делал C++ до C++11 (см. правая угловая скобка).

Чтобы обойти это, исходный код MIDL 3.0 должен вводить произвольный пробел (например, один символ пробела) между последовательными закрывающими угловыми скобками, чтобы он интерпретировался как два отдельных токена, а не одиночный токен. Следующее должно скомпилироваться:

static IAsyncOperation<IVector<String> > ScanInterfacesAsync();
person IInspectable    schedule 29.11.2018
comment
Ха, да, это помогло. Клянусь, я пробовал это раньше, но у меня были некоторые другие проблемы с именами типов, которые, я думаю, я прояснил только позже. Так или иначе, работает сейчас. Спасибо. - person Sean Kelly; 29.11.2018