您是否应该在头文件中制作 IAsyncAction/IAsyncOperation 协程(函数)的原型?

Are you supposed to prototype IAsyncAction/IAsyncOperation coroutines (functions) in the header files?

我是 C++/WinRT 和 c++ 的 concurrency/thread 主题的新手。我有一个奇怪的问题,因为我通常为我的 .cpp 文件创建头文件。我 运行 尝试在我的 .h 文件中制作我的 IAsyncAction 协程原型时出错。我在一个新的测试项目中重现了同样的错误。 错误:E0311 cannot overload functions distinguished by return type alone 这是 .h 文件:

#pragma comment(lib, "windowsapp")

#include <iostream>
#include <ppltasks.h>
#include <pplawait.h>
#include <Windows.h>
#include <winrt/Windows.Foundation.Collections.h>
#include <winrt/Windows.Web.Syndication.h>

IAsyncAction DoWorkOnThreadPoolAsync(int a);
void errTest();

和 .cpp 文件:

#include "testing.h"

using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::Web::Syndication;
using namespace std::chrono_literals;

concurrency::task<std::wstring> RetrieveFirstTitleAsync()
{

    return concurrency::create_task([]
    {
        for (int i = 0; i < 6; i++)
        {
            Sleep(1000);
            printf("4\n");
        }
        Uri rssFeedUri{ L"https://blogs.windows.com/feed" };
        SyndicationClient syndicationClient;
        SyndicationFeed syndicationFeed{ syndicationClient.RetrieveFeedAsync(rssFeedUri).get() };
        return std::wstring{ syndicationFeed.Items().GetAt(0).Title().Text() };
    });
}

int main()
{
    winrt::init_apartment();
    printf("0\n");
    auto firstTitleOp{ DoWorkOnThreadPoolAsync(1) };
    auto countLoop{ RetrieveFirstTitleAsync() };
    printf("1 \n");
    Sleep(2000);
    printf("2 \n");
    Sleep(2000);
    printf("5 \n");

    firstTitleOp.get();
    std::wcout << countLoop.get() << std::endl;
    printf("3 \n");
}

IAsyncAction DoWorkOnThreadPoolAsync(int a)
{
    co_await winrt::resume_background(); // Return control; resume on thread pool.

    uint32_t result = 6;
    for (uint32_t x = 0; x < 15; ++x)
        {
            // Do compute-bound work here.
            co_await 400ms;
            printf("x: %d \n", x);
        }
    co_return;
}

void errTest() {
    
}

如果我从 .h 文件中删除原型并将其原型放在 .cpp 的顶部,它就会构建。此外,如果我将该函数移动到调用它的任何其他函数之上,该项目就会构建(有意义)。我只是好奇是否有办法在头文件中对其进行原型设计,以便我可以从其他 .cpp 文件中调用它。

在 h 文件中,您没有提供命名空间 winrt::Windows::Foundation,其中 IAsyncAction 已定义。

这里有两个选择:(1) 移动

using namespace winrt;
using namespace Windows::Foundation;

到头文件或 (2) 使用完整范围:

winrt::Windows::Foundation::IAsyncAction DoWorkOnThreadPoolAsync(int a);