ত্রুটি: সদস্যের জন্য অনুরোধ '..' ইন '..' যা শ্রেণিবদ্ধ প্রকারের


440

আমার দুটি কনস্ট্রাক্টর সহ একটি ক্লাস রয়েছে, এটি একটি যুক্তি নেয় না এবং একটি যুক্তি নেয় takes

কনট্রাক্টর ব্যবহার করে অবজেক্ট তৈরি করা যা একটি আর্গুমেন্ট নেয় প্রত্যাশার সাথে কাজ করে। তবে, যদি আমি কনস্ট্রাক্টর ব্যবহার করে কোনও আর্গুমেন্ট না নিয়ে এমন বস্তু তৈরি করি তবে আমি একটি ত্রুটি পেয়েছি।

উদাহরণস্বরূপ, আমি যদি এই কোডটি সংকলন করি (জি ++ ৪.০.১ ব্যবহার করে) ...

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
কম্পাইলার কেন মনে করে তা আমি বুঝতে পারছি না: মূল ফাংশনের অভ্যন্তরে ফাংশন ঘোষণা হিসাবে ফু foo2 ()।
চাভিয়ার্স মিশালিস

স্পষ্টতই আমি এই উত্তরটিতে আগে থেকে নেমেছি কারণ আমি আবার উত্তর দিতে পারি না! এখানে একটি পাঠ্য 2 য় upvote ... এবং একটি দ্বিতীয় ধন্যবাদ!
bigjosh

1
প্যারামিটারলেস ফাংশন ঘোষণার ক্ষেত্রে "অকার্যকর" প্যারামিটার বাধ্যতামূলক করা উচিত যাতে ধারাবাহিকতার দৃষ্টিকোণ থেকে এই ব্যবহারের অনুমতি দেওয়া হত। যদি আমার ভুল না হয় তবে কেএন্ডআর সি-র শূন্য শব্দটির বাধ্যতামূলক ব্যবহার ছিল।
রাজেশ

@ রাজেশ: একটি শূন্য প্যারামিটার তালিকা বাধ্যতামূলক নয়, এর অর্থ খালি প্যারামিটার তালিকা (অনির্ধারিত পরামিতি) থেকে আলাদা কিছু (শূন্য প্যারামিটার)।
বেন ভয়েগট

1
এটি ইউনিফর্মে স্যুইচ করার আরও ভাল কারণ is } ইনিশিয়ালেশন সিনট্যাক্স সি ++ 11
প্রবর্তিত

41

শুধু মাত্র নথির জন্য..

এটি আসলে আপনার কোডের সমাধান নয়, তবে কোনও ক্লাস উদাহরণের পদ্ধতিটি ভুলভাবে অ্যাক্সেস করার সময় আমার একই ত্রুটি বার্তা ছিল myPointerToClass, উদাহরণস্বরূপ

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

কোথায়

myPointerToClass->aMethodOfThatClass();

স্পষ্টতই সঠিক হবে।


11

জ্ঞান বেসে যুক্ত করার জন্য, আমি একই ত্রুটি পেয়েছি

if(class_iter->num == *int_iter)

যদিও আইডিই আমাকে ক্লাস_মিটারের জন্য সঠিক সদস্য দিয়েছে। স্পষ্টতই, সমস্যাটি এমন যে "anything"::iteratorকোনও সদস্য বলা হয় নি numতাই আমার এটির অবনতি হওয়া দরকার। যা এর মতো কাজ করে না:

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

... দৃশ্যত। শেষ পর্যন্ত আমি এটি দিয়ে এটি সমাধান করেছি:

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

আমি আশা করি এটি এমন কাউকে সহায়তা করবে যা এই প্রশ্নটি চালিয়েছিল আমি যেমন করেছিলাম।


8

যখন আপনি প্যারামিটারাইজড কনস্ট্রাক্টর ব্যবহার করার ইচ্ছা রাখেন না তখন কোনও ক্লাস অবজেক্ট ইনস্ট্যান্ট করার জন্য প্যারেন্টেসিসের প্রয়োজন হয় না।

কেবল ফু ফু 2 ব্যবহার করুন ;

এটা কাজ করবে।


7

আমারও অনুরূপ ত্রুটি ছিল, মনে হচ্ছে সংকলকটি তর্ক ছাড়াই কনস্ট্রাক্টরের কলটিকে ভুল বুঝে। আমি আপনার কোডে ভেরিয়েবলের ঘোষণা থেকে প্রথম বন্ধনী সরিয়ে এটির কাজ করেছি work

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 কনস্ট্রাক্টরের কাছে একটি অস্থায়ী বার অবজেক্টে যাওয়ার চেষ্টা করছিলাম। সংকলকটি এটিতে অনুবাদ করছে Turn

Foo foo(Bar(*)());

এটি হ'ল একটি ফাংশন ডিক্লেয়ারেশন যার নাম foo যা একটি Foo প্রদান করে যা একটি আর্গুমেন্ট গ্রহণ করে - একটি ফাংশন পয়েন্টার 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() )কিন্তু সংকলক এটি একটি ফাংশন ঘোষণা হিসাবে ব্যাখ্যা করছে।

সি ++ 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;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.