Là một tên lớp đủ điều kiện xuống phạm vi toàn cầu bao giờ được yêu cầu cho các định nghĩa hàm thành viên ngoài dòng?


14

Câu hỏi này khiến tôi băn khoăn liệu có bao giờ hữu ích / cần thiết để đủ điều kiện tên lớp (bao gồm cả toán tử phạm vi toàn cầu) trong định nghĩa hàm thành viên ngoài lớp không.

Một mặt, tôi chưa bao giờ thấy điều này được thực hiện trước đây (và cú pháp để làm như vậy có vẻ mơ hồ). Mặt khác, tra cứu tên C ++ rất không tầm thường, vì vậy có thể có một trường hợp góc tồn tại.

Câu hỏi:

Có bao giờ một trường hợp giới thiệu một định nghĩa hàm thành viên ngoài lớp
ReturnType (::Fully::Qualified::Class::Name::MemberFunctionName)(...) { ... }
sẽ khác với
ReturnType Fully::Qualified::Class::Name::MemberFunctionName(...) { ... }(không có ::tiền tố phạm vi toàn cầu ) không?

Lưu ý rằng các định nghĩa hàm thành viên phải được đặt vào một không gian tên bao quanh lớp, vì vậy đây không phải là một ví dụ hợp lệ.


Rất tò mò những gì các downvoter không thích về câu hỏi này. Phản hồi chào mừng!
Max Langhof

khi định nghĩa được đặt trong một không gian tên khác với khai báo? Đó là những gì tôi có trong tâm trí cho quesiton mà bạn liên kết
idclev 463035818 18/11/19

Rất tiếc, đã không đọc dấu nhỏ;)
idclev 463035818

@ trước đây là Unknown_463035818 Đó cũng là những gì tôi đã nghĩ, sau đó tôi đã thử và nhận ra nó sẽ không hoạt động, vì vậy tôi đã viết câu hỏi (hình dung người khác cũng sẽ tự hỏi).
Max Langhof

Câu trả lời:


12

Một chỉ thị sử dụng có thể gây ra Fullymơ hồ mà không đủ điều kiện.

namespace Foo {
    struct X {
    };
}

using namespace Foo;
struct X {
    void c();
};

void X::c() { } // ambiguous
void ::X::c() { } // OK

5

Nó là cần thiết nếu một người là một masochist và thích viết những thứ như thế này

namespace foo {
    namespace foo {
        struct bar {
            void baz();
        };
    }

   struct bar {
       void baz();
   };

   void foo::bar::baz() {
   }

   void (::foo::bar::baz)() {
   }
} 

Tất nhiên người ta có thể viết quá tải thứ hai như foo::foo::bar::baztrong phạm vi toàn cầu, nhưng câu hỏi đặt ra là liệu hai khai báo có thể có ý nghĩa khác nhau hay không. Tôi không khuyên bạn nên viết mã như vậy.


Vâng, đây thực sự là một câu trả lời hợp lệ, và thậm chí không cần a using. Rất vui được làm nổi bật các trường hợp khác nhau!
Max Langhof

2

Nếu một lệnh sử dụng được sử dụng thì có thể có một mã khó hiểu.

Hãy xem xét các chương trình trình diễn sau đây

#include <iostream>
#include <string>

namespace N1
{
    struct A
    {
        void f() const;
    };      
}

using namespace N1;

void A::f() const { std::cout << "N1::f()\n"; }

struct A
{
    void f() const;
};

void ::A::f() const { std::cout << "::f()\n"; }

int main() 
{
    N1::A().f();
    ::A().f();

    return 0;
}

Vì vậy, để dễ đọc tên đủ điều kiện này

void ::A::f() const { std::cout << "::f()\n"; }

hiển thị chính xác nơi hàm được khai báo.

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.