2015-06-11 5 views
8

मेरे पास एक छोटा लैम्ब्डा फ़ंक्शन है जो QTreeWidgetItem को ढूंढ और वापस करेगा। लेकिन अगर यह दिया गया आइटम नहीं मिलता है, तो यह nullptr वापस करेगा। लेकिन अगर मैं इसे संकलित करने की कोशिश करता हूं तो यह मुझे एक त्रुटि देता है।एक लैम्ब्डा फ़ंक्शन से नलप्टर को कैसे वापस करें?

समारोह:

auto takeTopLevelItem = [](QTreeWidget* aTreeWidget, const QString& aText) 
{ 
    const int count = aTreeWidget->topLevelItemCount(); 
    for (int index = 0; index < count; ++index) 
    { 
     auto item = aTreeWidget->topLevelItem(index); 
     if (item->text(0) == aText) 
     { 
      return aTreeWidget->takeTopLevelItem(index); 
     } 
    } 
    return nullptr; // This causes a compilation error. 
}; 

त्रुटि:

Error 1 error C3487: 'nullptr': all return expressions in a lambda must have the same type: previously it was 'QTreeWidgetItem *' cpp 251

मैं इस के साथ उल्लेख किया लाइन बदल गया है और अब यह संकलित:

return (QTreeWidgetItem*)(nullptr); 

लेकिन मैं इससे बचने के लिए करना चाहते हैं वाक्य - विन्यास। इसे कैसे हल किया जा सकता है ?

मैं Visual Studio 2012 का उपयोग करता हूं।

+0

यह वीएस2012 में एक बग जैसा दिखता है? – Yakk

+0

@Yakk: क्यों? त्रुटि संदेश बिल्कुल स्पष्ट है, है ना? – MSalters

+0

@MSalters हम्म। अजीब, मैंने वास्तव में सोचा था कि जब तक बाद के रिटर्न प्रकार संगत (निहित रूप से परिवर्तनीय) होते हैं तो पहला रिटर्न प्रकार, सब कुछ ठीक था। – Yakk

उत्तर

11

आप एक स्पष्ट वापसी प्रकार एनोटेशन जोड़ सकते हैं:

auto takeTopLevelItem = [](...) -> QTreeWidgetItem* 
{ 
    // ... 
} 

इस तरह nullptr आपके सूचक प्रकार में सही रूप से परिवर्तित हो जाएगा। आपको वह त्रुटि मिल रही है क्योंकि लैम्ब्डा मानता है कि कोई रूपांतरण नहीं किया जाना चाहिए, और एक वैध वैकल्पिक रिटर्न प्रकार के रूप में nullptr_t का व्यवहार करता है।


एक साइड नोट के रूप में, (std::)optional का उपयोग करने पर विचार करें। पॉइंटर्स की शून्यता का उपयोग लापता रिटर्न का प्रतिनिधित्व करने के लिए किया जा सकता है, लेकिन इसका मतलब यह नहीं है कि यह जरूरी है।

+4

मैं 'वैकल्पिक' से संबंधित अंतिम बिंदु से असहमत हूं:' क्यूटी 'में अधिकांश सामान पॉइंटर्स द्वारा पारित किया जाता है, और मेरा मानना ​​है कि इस लैम्ब्डा का नतीजा कहीं' क्यूटी 'में पारित किया गया है। साथ ही, यह आधुनिक शैली + का पालन करना बेहतर है, भले ही यह आधुनिक सी ++ में बुरा हो। – lisyarus

+1

@lisyarus इसलिए * पर विचार करें।इस विशेष उदाहरण में जरूरी नहीं है, लेकिन यह एक और पाठक के लिए एक विकल्प हो सकता है। –

+0

एक nullptr लौटने की बजाय 'std :: वैकल्पिक' का उपयोग करने के बारे में अंतिम टिप्पणी को हटाने पर विचार करें। मुझे नहीं लगता कि यह आपके उत्तर को बेहतर बनाता है। शीर्ष भाग सिर्फ सही है। –

2

सकता है कि आप कास्टिंग से वाक्य रचना से बचने के लिए, चाहते हैं, आप इसे इस तरह किए जा सकेंगे:

static_cast<QTreeWidgetItem*>(nullptr); 

मैं एक छोटा सा उदाहरण बना दिया है, कैसे Bartek के पर और मेरा जवाब वास्तव में काम करते हैं:

#include <iostream> 

class A { 
    int a; 
}; 

auto bla = [] (A* obj, bool flag) -> A* { 
    if(flag) 
    return obj; 
    return nullptr; 
// return static_cast<A*>(nullptr); 
}; 

int main() { 
    A obj; 
    A* ptr = &obj; 
    bool flag = false; 
    if(bla(ptr, flag) == nullptr) 
    std::cout << "ok\n"; 
    return 0; 
} 
+1

* आपका उदाहरण ठीक क्यों संकलित नहीं होना चाहिए? पैरामीटर स्ट्रक्चर पूरी तरह से ओमेट किया जा सकता है, एक लैम्ब्डा छोड़कर जो रिटर्न प्रकार * बस * 'nullptr_t' है। –

+0

आप उत्तर बेहतर @ BartekBanachewicz है। मेरा हटाना और आपको +1 देना। – gsamaras

+0

आपकी 'static_cast' टिप्पणी पूरी तरह से ठीक थी हालांकि। –

संबंधित मुद्दे