【问题标题】:no viable overloaded '=' error in Xcode (Eclipse not showing errors)Xcode 中没有可行的重载 '=' 错误(Eclipse 未显示错误)
【发布时间】:2015-05-22 05:15:06
【问题描述】:

我尝试使用 Cocos2dx 3.4 制作游戏,并且在 Android 中一切正常(使用 Eclipse),所以我想在 Xcode for iOS 上尝试一下,看看它是否可以在那里工作,我将它导入 Xcode 但是当我尝试要编译它,我在listener1->onTouchEnded = [=](Touch* touch, Event* event) 收到此错误no viable overloaded '='

此代码来自 Cocos2d wiki EventDispatcher_Mechanism http://www.cocos2d-x.org/wiki/EventDispatcher_Mechanism

我的代码:

auto listener1 = EventListenerTouchOneByOne::create();

listener1->setSwallowTouches(true);


listener1->onTouchBegan = [](Touch* touch, Event* event) {  
        auto target = static_cast<Sprite*>(event->getCurrentTarget());
        Point locationInNode = target->convertToNodeSpace(touch->getLocation());
        Size s = target->getContentSize();
        Rect rect = Rect(0, 0, s.width, s.height);


        if (rect.containsPoint(locationInNode))
        {

            target->setOpacity(180);
            return true;
        }
        return false;
    };



listener1->onTouchEnded = [=](Touch* touch, Event* event) {
    auto target = static_cast<Sprite*>(event->getCurrentTarget());

    target->setOpacity(255);

        if (target == abc)
        {
            auto sceneABC = ABCfirst::createScene(mute);
            Director::getInstance()->replaceScene(sceneABC);
            return true;
        }

        if (target == n123)
        {
            auto sceneNumbers = Numbers::createScene(mute);
            Director::getInstance()->replaceScene(sceneNumbers);
            return true;
        }

        if (target == lgame)
        {
            auto scenePWL = PWL::createScene(mute);
            Director::getInstance()->replaceScene(scenePWL);
            return true;
        }

        if (target == ngame)
        {
            auto scenePWN = PWN::createScene(mute);
            Director::getInstance()->replaceScene(scenePWN);
            return true;
        }

        if (target == info)
        {
            auto sceneAbout = About::createScene();
            Director::getInstance()->replaceScene(sceneAbout);
            return true;
        }



    };

_eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, abc);
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener1->clone(),
        n123);
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener1->clone(),
        lgame);
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener1->clone(),
        ngame);
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener1->clone(),
            info);

我浏览了几页人们有类似问题的页面,但它没有解决我的问题。编译器设置为 c++11,onTouchBegan 为 bool 其余为 void(我使用 pyhton 脚本制作了项目)。

这是我第一次使用 xCode,所以我可能忘记了什么。提前谢谢你

【问题讨论】:

    标签: c++ xcode c++11 cocos2d-x


    【解决方案1】:

    我发现明确指定 lambda 的返回类型会有所帮助:

    [=](Touch* touch, Event* event) -> void { ... }
    

    这样编译器将帮助您摆脱其中的杂散返回语句。您目前正在尝试将带有签名 bool(Touch*,Event*) 的 lambda 分配给 std::function&lt;void(Touch*,Event*)&gt;

    【讨论】:

      【解决方案2】:

      尝试删除 this lambda 中的 return true 语句:

      [=](Touch* touch, Event* event) { ... }
      

      编译器会将您的 lambda 视为具有 bool 返回类型,而 onTouchEnded 不希望它返回 bool。如果您查看 Cocos2d 示例,则该示例不会返回任何内容(因此 lambda 是 void 类型)。只需删除您的 return true 语句,如果您想阻止其他分支执行,请使用 else ifs。

      【讨论】:

      • 你都对,但他是第一个,所以我给他解决了,但谢谢你的澄清,我真的很感激。
      猜你喜欢
      • 1970-01-01
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 2016-06-01
      • 1970-01-01
      相关资源
      最近更新 更多