Mam klasę z dwoma konstruktorami, jednym, który nie przyjmuje żadnych argumentów, i drugim, który przyjmuje jeden argument.
Tworzenie obiektów za pomocą konstruktora, który przyjmuje jeden argument, działa zgodnie z oczekiwaniami. Jeśli jednak tworzę obiekty za pomocą konstruktora, który nie przyjmuje argumentów, pojawia się błąd.
Na przykład, jeśli skompiluję ten kod (używając 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;
}
... pojawia się następujący błąd:
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 ()()’
Dlaczego tak się dzieje i jak to działa?
Odpowiedzi:
zmień na
Wystąpił błąd, ponieważ kompilator myśli
od deklaracji funkcji o nazwie „foo2” i typie zwracanym „Foo”.
Ale w takim przypadku Jeśli zmienimy na
Foo foo2
, kompilator może wyświetlić błąd" call of overloaded ‘Foo()’ is ambiguous"
.źródło
Dla przypomnienia ...
W rzeczywistości nie jest to rozwiązanie dla twojego kodu, ale miałem ten sam komunikat o błędzie, gdy niepoprawnie uzyskiwałem dostęp do metody instancji klasy, na którą wskazuje
myPointerToClass
np.gdzie
byłoby oczywiście poprawne.
źródło
Dodając do bazy wiedzy, otrzymałem ten sam błąd
Mimo że IDE dało mi poprawnych członków dla class_iter. Oczywiście problem polega na tym,
"anything"::iterator
że nie ma członka o nazwie,num
więc muszę go wyrejestrować. Co nie działa tak:...widocznie. W końcu to rozwiązałem:
Mam nadzieję, że to pomoże komuś, kto napotka takie pytanie, jak ja.
źródło
Nawias nie jest wymagany do utworzenia obiektu klasy, gdy nie zamierzasz używać sparametryzowanego konstruktora.
Wystarczy użyć Foo foo2;
To będzie działać.
źródło
Miałem podobny błąd, wygląda na to, że kompilator źle zrozumiał wywołanie konstruktora bez argumentów. Zrobiłem to, usuwając nawias z deklaracji zmiennej, w kodzie coś takiego:
źródło
[stmt.ambig/1]
i[dcl.ambig.res/1]
standard wyraźnie stwierdza, że w przypadku niejasności wszystko, co można interpretować jako deklarację, JEST deklaracją, aby rozwiązać tę dwuznaczność.)Natknąłem się na przypadek, w którym dostałem ten komunikat o błędzie i miałem
i w zasadzie próbował przekazać tymczasowy obiekt Bar do konstruktora Foo. Okazało się, że kompilator tłumaczył to
to znaczy deklaracja funkcji, której nazwa to foo, która zwraca Foo pobierające argument - wskaźnik funkcji zwracający słupek z 0 argumentami. Przechodząc tymczasowo w taki sposób, lepiej użyć
Bar{}
zamiastBar()
eliminować dwuznaczności.źródło
Jeśli chcesz zadeklarować nową substancję bez parametru (wiedząc, że obiekt ma parametry domyślne), nie pisz
ale
źródło
Z pewnością jest to przypadek narożny dla tego błędu, ale otrzymałem go w innej sytuacji, gdy próbowałem przeładować zadanie
operator=
. To było trochę tajemnicze IMO (od g ++ 8.1.1).Otrzymałem 2 „identyczne” błędy
(Równoważna błędu
clang
jest:error: member reference base type 'float' is not a structure or union
)dla linii
data.i = data;
idata.f = data;
. Okazało się, że kompilator myli lokalną nazwę zmiennej „data” i moją zmienną składowądata
. Gdy zmieniłem to navoid operator=(T newData)
idata.i = newData;
,data.f = newData;
błąd zniknął.źródło
@MykolaGolubyev już dawał wspaniałe wyjaśnienia. Szukałem rozwiązania pozwalającego zrobić coś takiego
MyClass obj ( MyAnotherClass() )
ale kompilator interpretuje to jako deklarację funkcji.C ++ 11 ma listę stężeń inicjujących . Korzystając z tego, możemy zrobić coś takiego
Jednak to:
zgłasza błąd kompilacji, jaki uważa
t
za typTemp(String (*)())
.źródło