tutorial - the c++ programming language




त्रुटि: '..' में सदस्य '..' के लिए अनुरोध जो गैर-वर्ग प्रकार का है (6)

मेरे पास दो रचनाकारों के साथ एक कक्षा है, जो कोई तर्क नहीं लेता है और वह एक तर्क लेता है।

कन्स्ट्रक्टर का उपयोग करके ऑब्जेक्ट्स बनाना जो एक तर्क लेता है अपेक्षित काम करता है। हालांकि, अगर मैं कन्स्ट्रक्टर का उपयोग करके ऑब्जेक्ट्स बनाता हूं जो कोई तर्क नहीं लेता है, तो मुझे एक त्रुटि मिलती है।

उदाहरण के लिए, यदि मैं इस कोड को संकलित करता हूं (g ++ 4.0.1 का उपयोग करके) ...

class Foo
{
  public:
    Foo() {};
    Foo(int a) {};
    void bar() {};
};

int main()
{
  // this works...
  Foo foo1(1);
  foo1.bar();

  // this does not...
  Foo foo2();
  foo2.bar();

  return 0;
}

... मुझे निम्नलिखित त्रुटि मिलती है:

nonclass.cpp: In function ‘int main(int, const char**)’:
nonclass.cpp:17: error: request for member ‘bar’ in ‘foo2’, which is of non-class type ‘Foo ()()’

यह क्यों है, और मैं इसे कैसे काम करूं?


जब आप पैरामीटरयुक्त कन्स्ट्रक्टर का उपयोग नहीं करना चाहते हैं तो क्लास ऑब्जेक्ट को तुरंत चालू करने के लिए पैरेन्थेसिस की आवश्यकता नहीं होती है।

बस Foo foo2 का उपयोग करें ;

यह काम करेगा।


ज्ञान आधार में जोड़ना, मुझे एक ही त्रुटि मिली

if(class_iter->num == *int_iter)

भले ही आईडीई ने मुझे कक्षा_आईटर के लिए सही सदस्य दिए। जाहिर है, समस्या यह है कि "anything"::iterator पास num नामक सदस्य नहीं है इसलिए मुझे इसे अस्वीकार करने की आवश्यकता है। जो इस तरह काम नहीं करता है:

if(*class_iter->num == *int_iter)

...जाहिरा तौर पर। अंत में मैंने इसे हल किया:

if((*class_iter)->num == *int_iter)

मुझे उम्मीद है कि यह किसी ऐसे व्यक्ति की मदद करता है जो इस सवाल से चलता है जिस तरह से मैंने किया था।


मेरी त्रुटि जोड़कर, मैंने कोशिश की है:

Foo.low[i]

के बजाय:

Foo[i].low


मैं एक ऐसे मामले में भाग गया जहां मुझे वह त्रुटि संदेश मिला और था

Foo foo(Bar());

और मूल रूप से फू कन्स्ट्रक्टर को अस्थायी बार ऑब्जेक्ट में पास करने की कोशिश कर रहा था। यह संकलन करता है कि संकलक इसका अनुवाद कर रहा था

Foo foo(Bar(*)());

यानी, एक फ़ंक्शन घोषणा जिसका नाम foo है जो एक Foo देता है जो तर्क में होता है - एक फ़ंक्शन पॉइंटर 0 तर्कों के साथ एक बार लौटाता है। इस तरह के अस्थायी में गुजरते समय, अस्पष्टता को खत्म करने के लिए Bar{} बजाय Bar{} का उपयोग करना बेहतर होता है।


सिर्फ रिकार्ड के लिए..

यह वास्तव में आपके कोड का समाधान नहीं है, लेकिन मेरे पास एक ही त्रुटि संदेश था जब गलत तरीके से क्लास इंस्टेंस की विधि को एक्सेस किया गया myPointerToClass , जो myPointerToClass द्वारा इंगित किया गया myPointerToClass , उदाहरण के लिए

MyClass* myPointerToClass = new MyClass();
myPointerToClass.aMethodOfThatClass();

कहा पे

myPointerToClass->aMethodOfThatClass();

स्पष्ट रूप से सही होगा।


Foo foo2();

में बदलो

Foo foo2;

आपको त्रुटि मिलती है क्योंकि संकलक सोचता है

Foo foo2()

नाम 'foo2' और वापसी प्रकार 'Foo' के साथ फ़ंक्शन घोषणा के रूप में।

लेकिन उस स्थिति में यदि हम Foo foo2 बदलते हैं, तो संकलक त्रुटि को दिखा सकता है " call of overloaded 'Foo()' is ambiguous"





c++