Không thể đủ điều kiện tên lớp trong trình khai báo ngoài lớp của định nghĩa hàm


12

Chương trình này dẫn đến một ngõ cụt tham lam phân tích không mong muốn:

struct float4x4 {};
class C
{
    float4x4 M();
};

float4x4 ::C::M()
{
    return float4x4{};
}

: 8: 1: lỗi: không có thành viên nào có tên 'C' trong 'float4x4'; ý bạn chỉ đơn giản là 'C'?
float4x4 :: C :: M ()
^ ~~~~~~~~~~~

Có thể được 'cố định' bằng cách sử dụng kiểu trả về theo sau:

auto ::C::M() -> float4x4
{}

bây giờ tất cả đều tốt

Vì vậy, tôi cho rằng chúng ta không thể đủ điều kiện tên lớp khi sử dụng cú pháp khai báo kiểu trả về?


2
Miễn là C ++ bỏ qua khoảng trắng xung quanh ::, tôi cho rằng không còn cách nào khác.
Yksisarvinen

@Someprogrammerdude yep, hãy xem điều này godbolt.org/z/mt6GHD
v.oddou

3
Phần này ::Ctrông giống như một cách giải quyết cho một số vấn đề khác. Nếu không, nó có thể chỉ đơn giản C(như trình biên dịch gợi ý;)
rustyx

2
@rustyx đó chỉ là phát xạ lại mã cơ học bởi một bộ chuyển mã không muốn thực thi một "tên đủ điều kiện" cực kỳ phức tạp tại vị trí này. phát ra một tên FQ bỏ qua việc tra cứu hoàn toàn và thuận tiện cho các công cụ như vậy.
v.oddou

Câu trả lời:


10

Bạn có thể đặt dấu ngoặc để định hướng:

float4x4 (::C::M)()
{
    return float4x4{};
}

Tôi thực sự không thể nói cho bạn biết quy tắc nào làm cho điều này ổn, trong khi nó không phải không có dấu ngoặc, mặc dù tôi đã thử nghiệm với gcc và clang (cả hai -pedantic). Tôi thích loại trả về trailing.


1
đáng kinh ngạc. thực sự chúng ta có thể godbolt.org/z/KCFbJZ thật kinh tởm nhưng thật tuyệt vời. Tất nhiên về mặt phong cách thì trailing là tuyệt vời. Nhưng trong trường hợp của tôi, tôi nhắm vào một phương ngữ không hỗ trợ nó.
v.oddou
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.