kesalahan kualifikasi tambahan di C ++

120

Saya memiliki fungsi anggota yang didefinisikan sebagai berikut:

Value JSONDeserializer::ParseValue(TDR type, const json_string& valueString);

Saat saya mengompilasi sumbernya, saya mendapatkan:

kesalahan: kualifikasi tambahan 'JSONDeserializer ::' pada anggota 'ParseValue'

Apa ini? Bagaimana cara menghapus kesalahan ini?

prosseek
sumber

Jawaban:

209

Ini karena Anda memiliki kode berikut:

class JSONDeserializer
{
    Value JSONDeserializer::ParseValue(TDR type, const json_string& valueString);
};

Ini bukan C ++ valid tetapi Visual Studio tampaknya menerimanya. Anda perlu mengubahnya ke kode berikut untuk dapat mengkompilasinya dengan kompiler yang memenuhi standar (gcc lebih sesuai dengan standar pada poin ini).

class JSONDeserializer
{
    Value ParseValue(TDR type, const json_string& valueString);
};

Kesalahan berasal dari fakta bahwa JSONDeserializer::ParseValuenama yang memenuhi syarat (nama dengan kualifikasi ruang nama), dan nama seperti itu dilarang sebagai nama metode di kelas.

Sylvain Defresne
sumber
1
Apakah ada cara untuk membuat Visual Studio memperingatkan tentang ini?
altumano
1
@altumano: Tidak, tetapi Cppcheck dapat melakukannya dan juga mendeteksi karakter non-ASCII dalam pengenal yang membantu menjaga kode agar lebih portabel ke gcc.
gigi tajam
@sharptooth: terima kasih, Cppcheck memang dapat mendeteksi kesalahan tersebut. Bahkan ada plugin Visual Studio untuk Cppcheck (tapi itu buggy dan tidak mendeteksi di semua file)
altumano
3
@altumano: Apakah hal ini github.com/VioletGiraffe/cppcheck-vs-addin ? Jika demikian, bisakah Anda melaporkan bug - proyek itu cukup aktif dan ada kemungkinan besar akan diperbaiki.
gigi tajam
Halo dari The Future. Anda sekarang dapat memaksa MSVC untuk memperingatkan tentang ini, dengan mengaktifkan peringatan C4596 - docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/… . Saya akan melangkah lebih jauh agar dilaporkan sebagai kesalahan, dengan menambahkan sakelar kompiler / we4596
Len
19

Ini berarti kelas disebutkan secara berlebihan dengan fungsi kelas. Coba hapusJSONDeserializer::

joe_coolish
sumber
13

Apakah Anda meletakkan baris ini di dalam deklarasi kelas? Dalam hal ini, Anda harus menghapus file JSONDeserializer::.

Boaz Yaniv
sumber
6

Catatan yang layak untuk keterbacaan / pemeliharaan:

Anda dapat mempertahankan JSONDeserializer::qualifier dengan definisi dalam file implementasi Anda (* .cpp).

Selama deklarasi di dalam kelas Anda (seperti yang disebutkan oleh orang lain) tidak memiliki kualifikasi, g ++ / gcc akan berfungsi dengan baik.

Sebagai contoh:

Di myFile.h:

class JSONDeserializer
{
    Value ParseValue(TDR type, const json_string& valueString);
};

Dan di myFile.cpp:

Value JSONDeserializer::ParseValue(TDR type, const json_string& valueString)
{
    do_something(type, valueString);
}

Ketika myFile.cpp mengimplementasikan metode dari banyak kelas, ada baiknya untuk mengetahui siapa milik siapa, hanya dengan melihat definisinya.

bunkerdive
sumber
JSONDeserializer::untuk file cpp (atau definisi secara umum) diperlukan. Jika tidak, Anda mendapatkan referensi yang tidak ditentukan. coliru.stacked-crooked.com/a/8f8a0cd3f9db6c94 coliru.stacked-crooked.com/a/6cd1efe94c09d521
Zoe