2010-03-01 45 views
8

Thách thức:Tại sao định nghĩa riêng biệt này lại gây ra lỗi?

Tôi có mã này không biên dịch được. Bạn có thể tìm ra điều gì sai? Nó gây đau đầu cho tôi một lần.

// header 
namespace values { 
    extern std::string address; 
    extern int port; 
} 

// .cpp file 
std::string ::values::address = "192.0.0.1"; 
int   ::values::port = 12; 

Có vẻ chính xác ngay từ cái nhìn đầu tiên. Có bao nhiêu và đó là lỗi !?

+0

Trình biên dịch nói gì? –

+0

Bạn có biết câu trả lời chưa? Có vẻ như nó;) –

+0

@Nikolai, thử thách mà không có xD –

Trả lời

8

Một lỗi:

std::string values::address = "192.0.0.1"; 

là hình thức thích hợp, nếu không phân tích cú pháp là

std::string::values::address = "192.0.0.1"; 

và không có thành viên "giá trị" với một "địa chỉ" thành viên bên trong "chuỗi" ..

nó sẽ hoạt động đối với các loại nội trang vì chúng không bao giờ chứa thành viên .. vì vậy giá trị int :: là một phân tích rõ ràng, giá trị int :: bởi vì trước đó không có ý nghĩa.

std::string (::values::address) = "192.0.0.1"; 

cũng hoạt động. Lưu ý rằng nếu bạn gõ typ sometef; rằng bạn có cùng một vấn đề bằng cách sử dụng sometype như bạn làm với chuỗi ở trên, nhưng không phải với "int".

+0

hah, bạn là người chiến thắng. Gọn gàng :) –

+0

cố định. theo sự điều chỉnh của litb. –

3

tôi đến trễ để các trò chơi, nhưng tôi có vẻ rất muốn ghi các file cpp như:

// .cpp file 
namespace values { 
    std::string address = "192.0.0.1"; 
    int   port = 12; 
} 

Dĩ nhiên điều đó không giải quyết vấn đề bạn đã có với việc kê khai friend.

+0

Tôi nghi ngờ ví dụ ban đầu của tôi với "địa chỉ" công cụ đã được lame :) Ví dụ bạn bè là tốt hơn nhiều. Tôi đồng ý với bạn rằng cách định nghĩa này là cách tốt hơn :) –

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