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?

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.


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::


13

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


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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.