2012-03-22 38 views
5

Mã nguồn sau biên dịch một cách chính xác với Visual Studio 2010:Mã biên dịch trong Visual Studio 2010 nhưng không nên biên dịch ở tất cả

namespace NS 
    { 
    class X 
     { 
     }; 
    X Y(X str); 
    } 

void myFun() 
    { 
    NS::X x; 
    Y(x); 
    } 

(này đang giảm mà tất cả lớp học và chức năng riêng tên của tôi đã được thay thế bởi X, Y, ...)

Tôi hy vọng rằng dòng Y(x) sẽ không biên dịch được, vì nó phải là NS::Y(x).

mã nguồn này được biên soạn với lệnh sau đây

cl /c file.cpp 

Không có tệp nào khác bao gồm ở đây, không có tùy chọn dòng lệnh khác.

Tại sao tệp này biên dịch? Lỗi trong VS2010? Hoặc một cái gì đó mà tôi (và 3 đồng nghiệp khác của tôi) bỏ qua?

+1

đã thử điều này với g ++ và nhận 'tham chiếu không xác định đối với NS :: Y (NS :: X) '' - vì vậy có thể nó có thể là lỗi trong VS .. – WeaselFox

+2

http://ideone.com/WzC6V –

+0

@WeaselFox : hoàn toàn không liên quan. Lỗi của bạn là lỗi * linker * vì 'NS :: Y' không được xác định. Nó là điển hình, và có lẽ sẽ được định nghĩa trong một tập tin khác trên một thiết lập hoàn chỉnh. –

Trả lời

9

Điều bạn đang gặp phải là do ADL (Argument Dependent Lookup).

Không có gì sai với đoạn trích của bạn (ngoài thực tế là người liên kết có thể khiếu nại về NS::Y không được xác định), nhưng cần biên dịch - VS2012 đang xử lý đoạn mã như mong muốn.

Trình biên dịch sẽ tìm thấy NS::Y do thực tế là loại thông số x (NS::X) nằm trong phạm vi phù hợp.


3.4.2Đối số phụ thuộc vào tra cứu tên [basic.lookup.argdep]

  1. Khi một cái tên không đủ tiêu chuẩn được sử dụng như postfix thể hiện trong một cuộc gọi chức năng (5.2.2), các không gian tên khác không được xem xét trong tra cứu không đủ tiêu chuẩn thông thường (3.4.1) có thể được tìm kiếm và trong các sốđókhông gian tên, khai báo hàm tên người bạn phạm vi không gian tên (11.4) không nếu không có thể nhìn thấy được.

    Những sửa đổi đối với tìm kiếm tùy thuộc vào loại đối số (và đối số mẫu mẫu, không gian tên của đối số mẫu ).

  2. Đối với mỗi loại đối số T trong cuộc gọi hàm, có một tập hợp không hoặc nhiều không gian tên được liên kết và tập hợp số không hoặc nhiều hơn các lớp liên quan cần xem xét.

    Bộ không gian tên và các lớp được xác định hoàn toàn theo các loại đối số hàm (và không gian tên của bất kỳ đối số mẫu mẫu nào).

+0

Bạn nói đúng, tôi cũng tìm thấy nó trên Wikipedia. Khôn lanh. Tôi đã không mong đợi điều này để làm việc. – Patrick

+0

Vì vậy, nó là một lỗi trong MSVS hoặc gcc? –

+2

@LuchianGrigore Không có lỗi, đoạn mã biên dịch. Trình liên kết không thể tìm thấy định nghĩa của 'NS :: Y'. Có một vài bước khi xây dựng một tệp thực thi. –

Các vấn đề liên quan