C ++ 'da ekstra nitelik hatası


120

Aşağıdaki gibi tanımlanan bir üye işlevim var:

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

Kaynağı derlediğimde şunu elde ederim:

hata: 'ParseValue' üyesinde ekstra nitelik 'JSONDeserializer ::'

Bu nedir? Bu hatayı nasıl kaldırırım?

Yanıtlar:


209

Bunun nedeni, aşağıdaki koda sahip olmanızdır:

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

Bu geçerli C ++ değil, ancak Visual Studio bunu kabul ediyor gibi görünüyor. Standart uyumlu bir derleyici ile derleyebilmek için aşağıdaki koda değiştirmelisiniz (gcc bu noktada standartla daha uyumludur).

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

Hata JSONDeserializer::ParseValue, nitelikli bir ad (ad alanı niteliğine sahip bir ad) olmasından ve böyle bir adın bir sınıfta yöntem adı olarak yasaklanmasından kaynaklanır.


1
Visual Studio'nun bu konuda uyarmasını sağlamanın bir yolu var mı?
altumano

1
@altumano: Hayır, ancak Cppcheck bunu yapabilir ve ayrıca tanımlayıcılardaki ASCII olmayan karakterleri de algılayarak kodu gcc'ye daha taşınabilir tutmaya yardımcı olur.
keskin dişli

@sharptooth: teşekkürler, Cppcheck bu hataları gerçekten algılayabilir. Cppcheck için bir Visual Studio eklentisi bile var (ancak hatalı ve tüm dosyalarda algılanmıyor)
altumano

3
@altumano: Bu şey github.com/VioletGiraffe/cppcheck-vs-addin mi? Eğer öyleyse lütfen hatayı bildirin - bu proje oldukça canlı ve düzeltilme şansı çok yüksek.
keskin dişli

The Future'dan merhaba. Artık C4596 uyarısını etkinleştirerek MSVC'yi bu konuda uyarmaya zorlayabilirsiniz - docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/… . Derleyici anahtarını / we4596
Len

19

Bu, bir sınıfın bir sınıf işlevi ile gereksiz yere bahsedildiği anlamına gelir. Kaldırmayı deneJSONDeserializer::


13

Bu satırı sınıf bildiriminin içine mi koyuyorsunuz ? Bu durumda JSONDeserializer::.


6

Okunabilirlik / sürdürülebilirlik için değerli bir not:

JSONDeserializer::Niteleyiciyi uygulama dosyanızdaki (* .cpp) tanımla tutabilirsiniz .

Sınıf içi beyanınız (başkalarının da belirttiği gibi) niteleyiciye sahip olmadığı sürece, g ++ / gcc iyi çalışacaktır.

Örneğin:

MyFile.h dosyasında:

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

Ve myFile.cpp'de:

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

MyFile.cpp birçok sınıftan yöntemler uyguladığında, sadece tanıma bakarak kimin kime ait olduğunu bilmeye yardımcı olur.


JSONDeserializer::cpp dosyası için (veya genel olarak tanım) gereklidir. Aksi takdirde, tanımlanmamış bir referans alırsınız. coliru.stacked-crooked.com/a/8f8a0cd3f9db6c94 coliru.stacked-crooked.com/a/6cd1efe94c09d521
Zoe,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.