ข้อผิดพลาดคุณสมบัติพิเศษใน C ++


120

ฉันมีฟังก์ชันสมาชิกที่กำหนดไว้ดังนี้:

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

เมื่อฉันรวบรวมแหล่งที่มาฉันจะได้รับ:

ข้อผิดพลาด: คุณสมบัติพิเศษ 'JSONDeserializer ::' ในสมาชิก 'ParseValue'

นี่คืออะไร? ฉันจะลบข้อผิดพลาดนี้ได้อย่างไร

คำตอบ:


209

เนื่องจากคุณมีรหัสต่อไปนี้:

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

นี่ไม่ใช่ C ++ ที่ถูกต้อง แต่ Visual Studio ดูเหมือนจะยอมรับ คุณต้องเปลี่ยนเป็นรหัสต่อไปนี้เพื่อให้สามารถคอมไพล์กับคอมไพเลอร์ที่เป็นไปตามมาตรฐานได้ (gcc สอดคล้องกับมาตรฐานมากกว่าในประเด็นนี้)

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

ข้อผิดพลาดมาจากข้อเท็จจริงที่JSONDeserializer::ParseValueเป็นชื่อที่ถูกต้อง (ชื่อที่มีคุณสมบัติเนมสเปซ) และชื่อดังกล่าวถูกห้ามเป็นชื่อเมธอดในคลาส


1
มีวิธีใดบ้างที่จะทำให้ Visual Studio เตือนเกี่ยวกับเรื่องนี้
altumano

1
@altumano: ไม่ แต่Cppcheckสามารถทำเช่นนั้นได้และยังตรวจพบอักขระที่ไม่ใช่ ASCII ในตัวระบุซึ่งช่วยให้โค้ดพกพาไปยัง gcc ได้มากขึ้น
sharptooth

@sharptooth: ขอบคุณ Cppcheck สามารถตรวจจับข้อผิดพลาดเหล่านั้นได้อย่างแน่นอน แม้จะมีปลั๊กอิน Visual Studio สำหรับ Cppcheck (แต่มีข้อบกพร่องและตรวจไม่พบในทุกไฟล์)
altumano

3
@altumano: มันคือสิ่งนี้หรือเปล่าgithub.com/VioletGiraffe/cppcheck-vs-addin ? หากเป็นเช่นนั้นโปรดรายงานข้อบกพร่อง - โครงการนั้นค่อนข้างมีชีวิตอยู่และมีโอกาสดีที่จะได้รับการแก้ไข
sharptooth

สวัสดีจากอนาคต ตอนนี้คุณสามารถบังคับ MSVC เตือนเกี่ยวกับเรื่องนี้โดยการช่วยเตือน C4596 - docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/... ฉันจะรายงานว่ามันเป็นข้อผิดพลาดโดยการเพิ่มสวิตช์คอมไพเลอร์ / we4596
Len

19

ซึ่งหมายความว่าคลาสถูกกล่าวถึงซ้ำซ้อนด้วยฟังก์ชันคลาส ลองนำออกJSONDeserializer::


13

คุณวางบรรทัดนี้ไว้ในการประกาศคลาสหรือไม่? ในกรณีนั้นคุณควรลบไฟล์JSONDeserializer::.


6

ข้อควรทราบสำหรับการอ่าน / การบำรุงรักษา:

คุณสามารถคงJSONDeserializer::คุณสมบัติที่มีคำจำกัดความไว้ในไฟล์การนำไปใช้งานของคุณ (* .cpp)

ตราบใดที่การประกาศในคลาสของคุณ (ตามที่ผู้อื่นกล่าวถึง) ไม่มีคุณสมบัติ g ++ / gcc ก็จะเล่นได้ดี

ตัวอย่างเช่น:

ใน myFile.h:

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

และใน myFile.cpp:

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

เมื่อ myFile.cpp ใช้เมธอดจากหลายคลาสมันจะช่วยให้รู้ว่าใครเป็นของใครเพียงแค่ดูคำจำกัดความ


JSONDeserializer::สำหรับไฟล์ cpp (หรือข้อกำหนดโดยทั่วไป) เป็นสิ่งจำเป็น มิฉะนั้นคุณจะได้รับข้อมูลอ้างอิงที่ไม่ได้กำหนด coliru.stacked-crooked.com/a/8f8a0cd3f9db6c94 coliru.stacked-crooked.com/a/6cd1efe94c09d521
Zoe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.