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


440

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

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

उदाहरण के लिए, यदि मैं इस कोड को संकलित करता हूं (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 ()()’

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


संबंधित: stackoverflow.com/q/2318650/69537
Meysam

जवाबों:


661
Foo foo2();

में बदलो

Foo foo2;

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

Foo foo2()

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

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


6
मुझे समझ में नहीं आता है कि कंपाइलर क्यों सोचता है: फू फू 2 () फंक्शन डिक्लेरेशन के तौर पर, मेन फंक्शन के अंदर।
चविरास माईलिस

जाहिरा तौर पर मैं इस उत्तर पर पहले उतरा हूं क्योंकि मैं इसे फिर से नहीं बढ़ा सकता हूं! यहाँ एक पाठ 2 upvote है ... और एक 2 धन्यवाद!
बिगजॉश

1
पैरामीटर फ़ंक्शन की घोषणा में "शून्य" पैरामीटर को अनिवार्य होना चाहिए ताकि यह उपयोग स्थिरता के दृष्टिकोण से अनुमति हो। यदि मैं गलत नहीं हूँ, तो K & R C में शून्य शब्द का उपयोग अनिवार्य था।
राजेश

@ राजेश: एक शून्य पैरामीटर सूची अनिवार्य नहीं है, इसका मतलब सिर्फ खाली पैरामीटर सूची (अनिर्दिष्ट मानकों) से कुछ अलग (शून्य पैरामीटर) है।
बेन वोइगट

1
वर्दी पर स्विच करने का यह एक और अच्छा कारण है {} आरंभीकरण सिंटैक्स c ++ 11 में प्रस्तुत करता है
सुमदु

41

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

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

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

कहाँ पे

myPointerToClass->aMethodOfThatClass();

जाहिर है सही होगा।


11

नॉलेज बेस से जुड़ने पर मुझे वही त्रुटि मिली

if(class_iter->num == *int_iter)

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

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

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

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

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


8

जब आप एक पैरामीटर निर्माणकर्ता का उपयोग करने का इरादा नहीं करते हैं, तो कोष्ठक को एक क्लास ऑब्जेक्ट को तत्काल करने की आवश्यकता नहीं होती है।

बस फू Foo2 का उपयोग करें ;

यह काम करेगा।


7

मुझे एक समान त्रुटि हो रही थी, ऐसा लगता है कि कंपाइलर ने तर्क के बिना निर्माता को कॉल को गलत समझा। मैंने चर घोषणा से कोष्ठक को हटाकर, आपके कोड में कुछ इस तरह से काम किया:

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

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

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

  return 0;
}


1
सबसे अप्रिय पार्स इतना है कि संकलक गलत समझा, के रूप में यह है कि मानक नहीं है की आवश्यकता है कुछ भी है कि एक समारोह घोषणा के रूप में एक समारोह घोषणा हो सकता है, अस्पष्टता को रोकने के लिए की व्याख्या करने के संकलक।
जस्टिन टाइम - मोनिका

(विशेष रूप से, बीच में [stmt.ambig/1]और [dcl.ambig.res/1], मानक स्पष्ट रूप से बताता है कि अस्पष्टता के मामले में, किसी भी चीज़ की व्याख्या की जा सकती है जो कि घोषणा है, उस अस्पष्टता को हल करने के लिए एक घोषणा है।)
जस्टिन टाइम -

2

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

Foo foo(Bar());

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

Foo foo(Bar(*)());

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


0

यदि आप किसी नए पैरामीटर को बिना किसी पैरामीटर के घोषित करना चाहते हैं (यह जानकर कि ऑब्जेक्ट में डिफ़ॉल्ट पैरामीटर हैं) नहीं लिखते हैं

 type substance1();

परंतु

 type substance;

0

निश्चित रूप से इस त्रुटि के लिए एक कोने का मामला है, लेकिन मैंने इसे एक अलग स्थिति में प्राप्त किया, जब असाइनमेंट को ओवरलोड करने का प्रयास किया गया operator=। यह थोड़ा गुप्त आईएमओ था (जी ++ 8.1.1 से)।

#include <cstdint>

enum DataType
{
  DT_INT32,
  DT_FLOAT
};

struct PrimitiveData
{
  union MyData
  {
    int32_t i;
    float f;
  } data;

  enum DataType dt;

  template<typename T>
  void operator=(T data)
  {
    switch(dt)
    {
      case DT_INT32:
      {
        data.i = data;
        break;
      }
      case DT_FLOAT:
      {
        data.f = data;
        break;
      }
      default:
      {
        break;
      }
    }
  }
};

int main()
{
  struct PrimitiveData pd;
  pd.dt = DT_FLOAT;
  pd = 3.4f;

  return 0;
}

मुझे 2 "समान" त्रुटियां मिलीं

error: request for member i [and 'f'] in data’, which is of non-class type float

(के लिए बराबर त्रुटि clangहै: error: member reference base type 'float' is not a structure or union)

लाइनों के लिए data.i = data;और data.f = data;। संकलक निकला स्थानीय चर नाम 'डेटा' और मेरे सदस्य चर को भ्रमित कर रहा था data। जब मैंने इसे बदल दिया , void operator=(T newData)और data.i = newData;, data.f = newData;त्रुटि दूर हो गई।


0

@ मायकोलागोलुबयेव पहले ही अद्भुत स्पष्टीकरण दे चुका है। मैं इस तरह से कुछ करने के लिए एक समाधान की तलाश में था, MyClass obj ( MyAnotherClass() )लेकिन संकलक इसे एक फ़ंक्शन घोषणा के रूप में व्याख्या कर रहा था।

C ++ 11 में ब्रेस-इन-लिस्ट है । इसके इस्तेमाल से हम कुछ ऐसा कर सकते हैं

Temp t{String()};

हालाँकि, यह:

Temp t(String());

संकलन त्रुटि को फेंकता है क्योंकि यह tप्रकार के रूप में मानता है Temp(String (*)())

#include <iostream>

class String {
public:
    String(const char* str): ptr(str)
    {
        std::cout << "Constructor: " << str << std::endl;
    }
    String(void): ptr(nullptr)
    {
        std::cout << "Constructor" << std::endl;
    }
    virtual ~String(void)
    {
        std::cout << "Destructor" << std::endl;
    }

private:
    const char *ptr;
};

class Temp {
public:
    Temp(String in): str(in)
    {
        std::cout << "Temp Constructor" << std::endl;
    }

    Temp(): str(String("hello"))
    {
        std::cout << "Temp Constructor: 2" << std::endl;
    }
    virtual ~Temp(void)
    {
        std::cout << "Temp Destructor" << std::endl;
    }

    virtual String get_str()
    {
        return str;
    }

private:
    String str;
};

int main(void)
{
    Temp t{String()}; // Compiles Success!
    // Temp t(String()); // Doesn't compile. Considers "t" as of type: Temp(String (*)())
    t.get_str(); // dummy statement just to check if we are able to access the member
    return 0;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.