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