Saya memiliki kelas dengan dua konstruktor, yang tidak menggunakan argumen dan yang menggunakan satu argumen.
Membuat objek menggunakan konstruktor yang mengambil satu argumen berfungsi seperti yang diharapkan. Namun, jika saya membuat objek menggunakan konstruktor yang tidak membutuhkan argumen, saya mendapatkan kesalahan.
Misalnya, jika saya mengkompilasi kode ini (menggunakan 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;
}
... Saya mendapatkan kesalahan berikut:
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 ()()’
Mengapa ini, dan bagaimana saya membuatnya bekerja?
Jawaban:
mengubah
Anda mendapatkan kesalahan karena dipikirkan oleh kompiler
pada deklarasi fungsi dengan nama 'foo2' dan jenis kembali 'Foo'.
Tetapi dalam kasus itu Jika kita berubah ke
Foo foo2
, kompiler mungkin menunjukkan kesalahan" call of overloaded ‘Foo()’ is ambiguous"
.sumber
Hanya sebagai catatan ..
Sebenarnya ini bukan solusi untuk kode Anda, tetapi saya memiliki pesan kesalahan yang sama ketika salah mengakses metode instance kelas yang ditunjukkan oleh
myPointerToClass
, misalnyadimana
jelas akan benar.
sumber
Menambah basis pengetahuan, saya mendapat kesalahan yang sama untuk
Meskipun IDE memberi saya anggota yang benar untuk class_iter. Jelas, masalahnya adalah bahwa
"anything"::iterator
tidak ada anggota yang dipanggilnum
jadi saya perlu menundanya. Yang tidak berfungsi seperti ini:...tampaknya. Saya akhirnya menyelesaikannya dengan ini:
Saya harap ini membantu seseorang yang menghadapi pertanyaan ini seperti yang saya lakukan.
sumber
Parenthesis tidak diperlukan untuk instantiate objek kelas ketika Anda tidak bermaksud menggunakan konstruktor parameterised.
Cukup gunakan Foo foo2;
Itu akan berhasil.
sumber
Saya mengalami kesalahan yang sama, sepertinya kompiler salah paham panggilan ke konstruktor tanpa argumen. Saya membuatnya bekerja dengan menghapus tanda kurung dari deklarasi variabel, dalam kode Anda sesuatu seperti ini:
sumber
[stmt.ambig/1]
dan[dcl.ambig.res/1]
, standar secara eksplisit menyatakan bahwa dalam hal ambiguitas, apa pun yang dapat diartikan sebagai deklarasi ADALAH deklarasi, untuk menyelesaikan ambiguitas itu.)Saya menemukan sebuah case dimana saya mendapatkan pesan kesalahan itu dan memilikinya
dan pada dasarnya mencoba meneruskan objek Bar sementara ke konstruktor Foo. Ternyata kompiler menerjemahkan ini ke
yaitu, deklarasi fungsi yang namanya foo yang mengembalikan Foo yang mengambil argumen - penunjuk fungsi mengembalikan Bar dengan 0 argumen. Saat melewati temporari seperti ini, lebih baik digunakan
Bar{}
daripadaBar()
menghilangkan ambiguitas.sumber
Jika Anda ingin mendeklarasikan substansi baru tanpa parameter (mengetahui bahwa objek memiliki parameter default) jangan menulis
tapi
sumber
Tentu saja sudut kasus untuk kesalahan ini, tetapi saya menerimanya dalam situasi yang berbeda, ketika mencoba untuk membebani tugas
operator=
. Itu agak samar IMO (dari g ++ 8.1.1).Saya menerima 2 kesalahan "identik"
(Kesalahan yang setara untuk
clang
adalaherror: member reference base type 'float' is not a structure or union
:)untuk garis
data.i = data;
dandata.f = data;
. Ternyata kompiler itu membingungkan nama variabel lokal 'data' dan variabel anggota sayadata
. Ketika saya mengubah ini menjadivoid operator=(T newData)
dandata.i = newData;
,data.f = newData;
kesalahan hilang.sumber
@MykolaGolubyev telah memberikan penjelasan yang luar biasa. Saya sedang mencari solusi untuk melakukan sesuatu seperti ini
MyClass obj ( MyAnotherClass() )
tetapi kompiler menafsirkannya sebagai deklarasi fungsi.C ++ 11 telah menguatkan-init-list . Dengan ini kita bisa melakukan sesuatu seperti ini
Namun, ini:
melempar kesalahan kompilasi karena dianggap
t
sebagai tipeTemp(String (*)())
.sumber