Error: запрос для члена '..' in '..', который относится к классу некласса

У меня есть класс с двумя конструкторами, один из которых не принимает аргументов и один принимает один аргумент.

Создание объектов с использованием конструктора, который принимает один аргумент, работает так, как ожидалось. Однако, если я создаю объекты, используя конструктор, который не принимает никаких аргументов, я получаю сообщение об ошибке.

Например, если я скомпилирую этот код (используя 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 ()()’

Почему это и как я могу заставить его работать?

Ответ 1

Foo foo2();

измените на

Foo foo2;

Вы получаете ошибку, потому что компилятор думает о

Foo foo2()

как объявление функции с именем "foo2" и возвращаемым типом "Foo".

Но в этом случае Если мы перейдем на Foo foo2, компилятор может показать ошибку " call of overloaded ‘Foo()’ is ambiguous".

Ответ 2

Только для записи.

На самом деле это не решение вашего кода, но у меня было такое же сообщение об ошибке при некорректном доступе к методу экземпляра класса, на который указывает myPointerToClass, например.

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

где

myPointerToClass->aMethodOfThatClass();

очевидно, будет правильным.

Ответ 3

Добавляя к базе знаний, я получил ту же ошибку для

if(class_iter->num == *int_iter)

Несмотря на то, что IDE предоставила мне правильные члены класса class. Очевидно, проблема заключается в том, что "anything"::iterator не имеет члена, называемого num, поэтому мне нужно разыменовать его. Что не работает так:

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

... очевидно. В конце концов я решил это сделать:

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

Я надеюсь, что это поможет кому-то, кто сталкивается с этим вопросом так, как я это сделал.

Ответ 4

У меня была аналогичная ошибка, похоже, что компилятор неправильно понимает вызов конструктора без аргументов. Я сделал это, удалив скобки из объявления переменной, в вашем коде что-то вроде этого:

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;
}

Ответ 5

Скоринговое окружение не требуется для создания экземпляра объекта класса, если вы не собираетесь использовать параметризованный конструктор.

Просто используйте Foo foo2;

Он будет работать.

Ответ 6

Я столкнулся с тем случаем, когда получил это сообщение об ошибке и имел

Foo foo(Bar());

и в основном пытался передать временный объект Bar в конструктор Foo. Оказывается, компилятор переводил это на

Foo foo(Bar(*)());

то есть объявление функции с именем foo, которое возвращает Foo, который принимает аргумент, - указатель функции, возвращающий строку с аргументами 0. При прохождении во временном режиме лучше использовать Bar{} вместо Bar() для устранения неоднозначности.

Ответ 7

Если вы хотите объявить новое вещество без параметров (зная, что объект имеет параметры по умолчанию), не пишите

 type substance1();

но

 type substance;

Ответ 8

Добавление моей ошибки, я пробовал:

Foo.low[i]

Вместо:

Foo[i].low