您是否应该在头文件中制作 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);
我是 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);