यह अन्य लोगों के लिए एक समान प्रश्न है, लेकिन मैंने जाँच की है कि इसे किस रूप में डुप्लिकेट के रूप में फ़्लैग किया जा रहा है, और सामान्य प्रतिक्रियाएँ मेरी मदद नहीं कर रही हैं क्योंकि या तो मैं उन्हें समझ नहीं पा रहा हूँ या वे मेरे मुद्दे के लिए अप्रासंगिक हैं। मुझे विशेष रूप से इस समस्या के लिए सहायता और/या समाधान की आवश्यकता है। कृपया और धन्यवाद। मैं एक "प्रोग्रामिंग भाषा" बना रहा हूं (लेकिन यह वास्तव में नहीं है, बस यह नहीं पता कि इसका वर्णन कैसे किया जाए), और मेरे कंटेनरलिस्ट क्लास में मुझे यह त्रुटि मिलती रहती है कि फ़ंक्शन के लिए कोई मिलान कॉल नहीं है। क्यों यह त्रुटि आ रही है?

मैंने कहां और कब कंस्ट्रक्टर का उपयोग या परिभाषित किया है या यदि यह मौजूद है तो भी हेरफेर करने की कोशिश की है। लेकिन ऐसा लगता है कि कोई भाग्य नहीं है। मैंने मेमोरीकंटेनर क्लास में देखा और ऐसा नहीं लगता कि त्रुटि पैदा करने के लिए कुछ भी है।

कंटेनरलिस्ट क्लास के लिए मेरा कोड यहां दिया गया है:

#include "MemoryContainer.cpp"

struct ContainerListItem{
    int index = 0;
    MemoryContainer item;
    ContainerListItem* nextItem;
    ContainerListItem(byte none) {}
};

class ContainerList{
    public:
    int getSize() {return size;}
    void addContainer(MemoryContainer item){
        ContainerListItem indexItem = ContainerListItem(1);
        indexItem.item = item;
        indexItem.index = size - 1;
        indexItem.nextItem = &firstItem;
        firstItem = indexItem;
        size++;
    }
    MemoryContainer getContainer(int index){
        ContainerListItem currentItem = ContainerListItem(1);
        currentItem = firstItem;

        while(currentItem.index != index)
            currentItem = *currentItem.nextItem;

        return currentItem.item;
    }
    private:
    int size = 1;
    ContainerListItem firstItem = ContainerListItem(1);
};

परिभाषित निर्माता के लिए पूर्ण त्रुटि:

In file included from Main.cpp:1:
ContainerList.cpp: In constructor ‘ContainerListItem::ContainerListItem(uint8_t)’:
ContainerList.cpp:7:34: error: no matching function for call to ‘MemoryContainer::MemoryContainer()’
     ContainerListItem(byte none) {}
                                  ^
In file included from ContainerList.cpp:1,
                 from Main.cpp:1:
MemoryContainer.cpp:24:5: note: candidate: ‘MemoryContainer::MemoryContainer(uint64_t, std::__cxx11::string)’
     MemoryContainer(lint ContainerSize, string name){
     ^~~~~~~~~~~~~~~
MemoryContainer.cpp:24:5: note:   candidate expects 2 arguments, 0 provided
MemoryContainer.cpp:17:7: note: candidate: ‘MemoryContainer::MemoryContainer(const MemoryContainer&)’
 class MemoryContainer{
       ^~~~~~~~~~~~~~~
MemoryContainer.cpp:17:7: note:   candidate expects 1 argument, 0 provided
MemoryContainer.cpp:17:7: note: candidate: ‘MemoryContainer::MemoryContainer(MemoryContainer&&)’
MemoryContainer.cpp:17:7: note:   candidate expects 1 argument, 0 provided
-1
pgrafhamster 27 अगस्त 2019, 01:43

1 उत्तर

सबसे बढ़िया उत्तर

आपकी ContainerListItem कक्षा में एक अन्य वर्ग का सदस्य है:

MemoryContainer item;

हालाँकि कंस्ट्रक्टर इसे बिल्कुल भी इनिशियलाइज़ नहीं करता है:

ContainerListItem(byte none) {}

कंस्ट्रक्टर ज्यादातर खाली है।

किसी वर्ग के सभी सदस्यों को उसके निर्माता द्वारा प्रारंभ किया जाना चाहिए। यदि कंस्ट्रक्टर स्पष्ट रूप से किसी वर्ग के सदस्य को इनिशियलाइज़ नहीं करता है, तो उसके पास एक डिफ़ॉल्ट कंस्ट्रक्टर होना चाहिए जो इसे इनिशियलाइज़ करता है। एक डिफ़ॉल्ट कंस्ट्रक्टर एक कंस्ट्रक्टर है जो कोई पैरामीटर नहीं लेता है।

आपने अपने MemoryContainer वर्ग की घोषणा नहीं दिखाई, लेकिन इसमें एक कंस्ट्रक्टर होना चाहिए जो कम से कम एक पैरामीटर लेता है (वास्तव में कुछ अन्य कारण भी हो सकते हैं, लेकिन यह सबसे अधिक संभावना है)।

जिसका अर्थ है कि ContainerListItem को या तो स्पष्ट रूप से कक्षा के सदस्य को इसका निर्माण करके प्रारंभ करना चाहिए, या आपको MemoryContainer में एक डिफ़ॉल्ट कंस्ट्रक्टर जोड़ना होगा।

यह ठीक वही है जो आपका कंपाइलर आपको बता रहा है, यदि आप इसके त्रुटि संदेश को ध्यान से पढ़ते हैं:

त्रुटि: 'मेमोरीकॉन्टेनर :: मेमोरीकॉन्टेनर ()' को कॉल करने के लिए कोई मिलान फ़ंक्शन नहीं

कंपाइलर आपको बता रहा है कि इस क्लास का डिफॉल्ट कंस्ट्रक्टर मौजूद नहीं है। क्योंकि ContainerListItem इस वर्ग के सदस्य को स्पष्ट रूप से प्रारंभ नहीं करता है, इसके डिफ़ॉल्ट निर्माता को कॉल किया जाना चाहिए। लेकिन यह घोषित नहीं है।

आप अपनी C++ पुस्तक में कक्षा के सदस्यों को आरंभ करने के विभिन्न तरीकों के बारे में अधिक जानकारी प्राप्त करेंगे। लेकिन अगर, उदाहरण के लिए, MemoryContainer का केवल कंस्ट्रक्टर एक int पैरामीटर लेता है, और आप इसे इनिशियलाइज़ करना चाहते हैं, तो इस मामले में, इसके कंस्ट्रक्टर को 0 से कॉल करते हुए, आपका ContainerListItem कंस्ट्रक्टर पढ़ेगा (आधुनिक C++ यूनिफॉर्म इनिशियलाइज़ेशन सिंटैक्स का उपयोग करके):

ContainerListItem(byte none) : item{0} {}

आपको यह पता लगाने की जरूरत है कि क्या आप MemoryContainer के लिए एक डिफॉल्ट कंस्ट्रक्टर को लागू करना चाहते हैं, या इसे यहां कैसे इनिशियलाइज़ करना है। कोई और आपके लिए इसका पता नहीं लगा सकता है, यह एक ऐसा निर्णय है जो केवल आप ही कर सकते हैं।

1
Sam Varshavchik 27 अगस्त 2019, 00:18