none
create_task的then 里边,不能给函数参数赋值吗? RRS feed

  • 问题

  • 自定义Class1,,,在 Class1 的 SendMessage(Platform::String ^ str1)

    里边,调用 create_task.then

    then {

    str1 = "123";

    }

    这样会报编译错误:error C3493:'str1' cannot be implicitly captured because no default capture mode has been specified....

    然后,底下还有很多编译错误!

    为什么?在 create_task 外边赋值就可以??

    2012年9月13日 1:55

答案

  • 你没有将 strOutPut  从Lambda 外部传递到你的表达式中。

    这里 }).then([this] (ISmsMessage^ msg)     改为    then([this, strOutPut] (ISmsMessage^ msg)


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年9月17日 2:49
    版主
  • create_task  之后的then 里面放置的是 C++ lambda表达式,你这里好像语法错的太多了。所以后面有一大堆错误。

    请先学习看下C++ 下的Lambda怎么写: http://msdn.microsoft.com/en-us/library/dd293608.aspx

    then([引用参量](传入参数){方法体})

    比如 

    create_task(StorageFolder.OpenFileAsync("xxx")).then( 
        [this /*将this引入lambda方法中*/] 
        (StorageFile file /*OpenFileAsync 的返回值*/  
        {/*方法体*/ this->xxx; ..... } );


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年9月13日 8:57
    版主

全部回复

  • create_task  之后的then 里面放置的是 C++ lambda表达式,你这里好像语法错的太多了。所以后面有一大堆错误。

    请先学习看下C++ 下的Lambda怎么写: http://msdn.microsoft.com/en-us/library/dd293608.aspx

    then([引用参量](传入参数){方法体})

    比如 

    create_task(StorageFolder.OpenFileAsync("xxx")).then( 
        [this /*将this引入lambda方法中*/] 
        (StorageFile file /*OpenFileAsync 的返回值*/  
        {/*方法体*/ this->xxx; ..... } );


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年9月13日 8:57
    版主
  • create_task  之后的then 里面放置的是 C++ lambda表达式,你这里好像语法错的太多了。所以后面有一大堆错误。

    请先学习看下C++ 下的Lambda怎么写: http://msdn.microsoft.com/en-us/library/dd293608.aspx

    then([引用参量](传入参数){方法体})

    比如 

    create_task(StorageFolder.OpenFileAsync("xxx")).then( 
        [this /*将this引入lambda方法中*/] 
        (StorageFile file /*OpenFileAsync 的返回值*/  
        {/*方法体*/ this->xxx; ..... } );


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    你好,我是从MFC 直接转 MetroUI 开发,对 Lambada 还真是不了解 。

    下面是我移植的一些代码!

    编译总是在这句话出错,

                    strOutPut = textMsg->Timestamp.ToString();

    为什么呢?


    void ReadMessage::DoReadMessage(Platform::String^ strOutPut)
    {
        // Clear message display.
        // Parse the message ID - must be number between 1 and maximum message count.
        auto parser = ref new DecimalFormatter();
        auto getId = parser->ParseUInt(ReadIdText->Text);

        if ((getId!=nullptr) && (getId->Value >= 1) && (getId->Value<=UINT32_MAX) && (getId->Value <= device->MessageStore->MaxMessages))
        {
            rootPage->NotifyUser("Reading message ...", NotifyType::StatusMessage);

            // Get the selected message from message store asynchronously.
            create_task([this, getId] () {
                return device->MessageStore->GetMessageAsync(static_cast<uint32> (getId->Value));
            }).then([this] (ISmsMessage^ msg)
            {
                ISmsBinaryMessage^ binaryMsg = static_cast<ISmsBinaryMessage^> (msg);
                SmsTextMessage^ textMsg = nullptr;

                // See if this is a text message by querying for the text message interface.
                if (binaryMsg != nullptr)
                {
                    textMsg = SmsTextMessage::FromBinaryMessage((SmsBinaryMessage^) msg);
                }

                // Display the text message information.
                if (textMsg != nullptr)
                {
                    strOutPut = textMsg->Timestamp.ToString();
                   
                    rootPage->NotifyUser("Message read.", NotifyType::StatusMessage);
                }
            }).then([this] (task<void> catchErrors)
            {
                try
                {
                    catchErrors.get();
                }
                catch (Platform::Exception^ ex)
                {
                    rootPage->NotifyUser(ex->Message, NotifyType::ErrorMessage);

                    // On failure, release the device. If the user revoked access or the device
                    // is removed, a new device object must be obtained.
                    device = nullptr;
                }
            });
        }
        else
        {
            rootPage->NotifyUser("Invalid ID number entered.", NotifyType::ErrorMessage);
        }
    }

    2012年9月17日 1:29
  • 你没有将 strOutPut  从Lambda 外部传递到你的表达式中。

    这里 }).then([this] (ISmsMessage^ msg)     改为    then([this, strOutPut] (ISmsMessage^ msg)


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年9月17日 2:49
    版主
  • 正确!

    已经修改成功!感谢!

    2012年9月17日 8:22