create_task调用ref class sealed constructor给出'create_task':找不到匹配的重载函数

时间:2017-08-11 11:12:23

标签: asynchronous uwp task c++-cx

我已创建调用MyClass的构造函数,我的类被定义为ref类Myclass已密封,此函数在public下被定义为static

IAsyncOperation<MyClass^>^ MyNameSpace::MyClass::CreateAsync()
{
    return create_task(MyClass()).then([](MyClass^ objectx)
    {
        return ref new MyClass();
        //return std::make_shared<MyClass>();
    });
}

这给了我一堆错误,如:

Error   C2672   'Concurrency::details::declval': no matching overloaded function found

Error   C2770   invalid explicit template argument(s) for '_Ty &&Concurrency::details::declval(void)'

Error   C2672   'Concurrency::details::_FilterValidTaskType': no matching overloaded function found

Error   C2672   'create_task': no matching overloaded function found

1 个答案:

答案 0 :(得分:1)

您的构造函数不是异步操作,因此不能用作create_task的参数。如果需要很长时间并且您想将构造函数作为任务运行,请改用create_async

create_async takes a function-like object (eg a lambda) and runs it as a task

从上面的示例中:

IAsyncOperation<MyClass^>^ MyNameSpace::MyClass::CreateAsync()
{
    return concurrency::create_async([]
    {
        return ref new MyClass();
    });
}

这将启动一个任务来运行lambda(构造你的类),然后将它包装在你可以使用的WinRT IAsyncOperation<>中。由于你的构造函数没有做任何事情,我不确定为什么你希望它是异步的(除非你省略了一堆昂贵的调用)。