lỗi trình độ bổ sung trong C ++


120

Tôi có một hàm thành viên được định nghĩa như sau:

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

Khi tôi biên dịch nguồn, tôi nhận được:

lỗi: trình độ bổ sung 'JSONDeserializer ::' trên thành viên 'ParseValue'

Cái này là cái gì? Làm cách nào để xóa lỗi này?

Câu trả lời:


209

Điều này là do bạn có mã sau đây:

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

Đây không phải là C ++ hợp lệ nhưng Visual Studio dường như chấp nhận nó. Bạn cần thay đổi mã thành mã sau để có thể biên dịch mã bằng trình biên dịch tuân thủ tiêu chuẩn (gcc tuân thủ chuẩn hơn về điểm này).

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

Lỗi xuất phát từ thực tế JSONDeserializer::ParseValuelà một tên đủ điều kiện (một tên có đủ điều kiện không gian tên) và một tên như vậy bị cấm làm tên phương thức trong một lớp.


1
Có cách nào để làm cho Visual Studio cảnh báo về điều này?
altumano

1
@altumano: Không, nhưng Cppcheck có thể làm điều đó và cũng phát hiện các ký tự không phải ASCII trong mã định danh giúp duy trì mã di động hơn cho gcc.
sharptooth

@sharptooth: cảm ơn, Cppcheck thực sự có thể phát hiện ra những lỗi đó. Thậm chí còn có một plugin Visual Studio cho Cppcheck (nhưng nó có lỗi và không phát hiện được trong tất cả các tệp)
altumano

3
@altumano: Đây có phải là điều này github.com/VioletGiraffe/cppcheck-vs-addin ? Nếu vậy bạn có thể vui lòng báo cáo lỗi - dự án đó vẫn còn sống và rất có thể nó sẽ được sửa.
sharptooth

Xin chào từ Tương lai. Bây giờ bạn có thể buộc MSVC cảnh báo về điều này, bằng cách bật cảnh báo C4596 - docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/ trộm . Tôi đã đi xa đến mức báo lỗi là do lỗi chuyển đổi trình biên dịch / we4596
Len

19

Điều này có nghĩa là một lớp được đề cập dự phòng với chức năng lớp. Hãy thử loại bỏJSONDeserializer::


13

Bạn đang đặt dòng này bên trong khai báo lớp? Trong trường hợp đó bạn nên loại bỏ JSONDeserializer::.


6

Một lưu ý xứng đáng cho khả năng đọc / bảo trì:

Bạn có thể giữ định tính JSONDeserializer::với định nghĩa trong tệp triển khai của mình (* .cpp).

Miễn là khai báo trong lớp của bạn (như được đề cập bởi những người khác) không có vòng loại, g ++ / gcc sẽ chơi tốt.

Ví dụ:

Trong myFile.h:

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

Và trong myFile.cpp:

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

Khi myFile.cpp thực hiện các phương thức từ nhiều lớp, sẽ giúp biết ai thuộc về ai, chỉ bằng cách nhìn vào định nghĩa.


JSONDeserializer::đối với tệp cpp (hoặc định nghĩa nói chung) là bắt buộc. Nếu không, bạn nhận được một tài liệu tham khảo không xác định. coliru.stacked-crooking.com/a/8f8a0cd3f9db6c94 coliru.stacked-crooking.com/a/6cd1efe94c09d521
Zoe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.