2010-09-26 31 views
8

Tôi biết tôi có thể làmTôi có thể "chuyển tiếp tuyên bố" trong C++?

class Foo; 

và có lẽ

struct Bar; 

và chức năng toàn cầu

bool IsValid(int iVal); 

gì về một enum đánh máy? Điều gì về một enum đánh máy trong một lớp không khai báo? Điều gì về một chức năng với một lớp không khai báo? Điều gì về một thành viên tĩnh trong một lớp không khai báo? Điều gì về chúng trong một không gian tên không xác định? Tôi có thiếu bất cứ điều gì khác mà có thể được chuyển tiếp tuyên bố?

+6

Tại sao bạn không thử và xem? –

+0

enum sẽ có khả năng chuyển tiếp khai báo trong C++ 0x. và bạn không thể "một phần" chuyển tiếp các lớp khai báo (khai báo trước các phương thức) – erjot

+0

Tôi có xu hướng đặt các enums được nhập vào trong các lớp "xác định" chúng. Sau đó tôi chạy vào các vấn đề trình biên dịch "phụ thuộc vòng tròn" với hai lớp tham khảo các enums của nhau. – franji1

Trả lời

12

Bạn có thể chuyển tiếp tuyên bố

  • Templates, trong đó có chuyên ngành phần
  • chuyên ngành Explicit
  • lớp lồng nhau (điều này bao gồm cấu trúc, "thật" các lớp học và các đoàn thể)
  • lớp Non-lồng nhau và địa phương
  • Biến ("extern int a;")
  • Chức năng

Nếu bằng "tuyên bố chuyển tiếp", bạn hoàn toàn có nghĩa là "khai báo nhưng không xác định", bạn cũng có thể chuyển tiếp các hàm thành viên khai báo. Nhưng bạn không thể redeclare chúng trong định nghĩa lớp học của họ một khi họ được tuyên bố. Bạn không thể chuyển tiếp kê khai liệt kê. Tôi không chắc mình có bỏ lỡ thứ gì không. Vui lòng lưu ý rằng tất cả các khai báo chuyển tiếp được liệt kê ở trên, ngoại trừ các chuyên môn từng phần và rõ ràng, cần khai báo sử dụng tên không đủ tiêu chuẩn và các hàm thành viên và các lớp lồng nhau chỉ có thể được khai báo nhưng không được định nghĩa trong định nghĩa lớp của chúng.

class A { }; 
class A::B; // not legal 

namespace A { } 
void A::f(); // not legal 

namespace A { void f(); } // legal 

class B { class C; }; // legal 
class B::C; // declaration-only not legal 

class D { template<typename T> class E; }; 
template<typename T> class D::E<T*>; // legal (c.f. 14.5.4/6) 
+1

Tôi nghĩ bạn đã quên lớp 'enum mới' từ C++ 0x. Điểm của precising đại diện cơ bản là để làm cho nó chuyển tiếp-declarable nếu tôi nhớ lại một cách chính xác. –

+0

có bất kỳ điểm nào trong việc tuyên bố trước một phần đặc biệt không? Chuyên môn từng phần không hiển thị trong quá trình tra cứu tên và được giải quyết tại thời điểm tạo mẫu - tại thời điểm đó, chúng phải được xác định hoàn toàn. – willj

+0

@willj nó được phép có một mẫu không xác định trong các ngữ cảnh nhất định (được tuyên bố trước) mà không có lỗi, nhưng làm một sự khởi tạo khi khuôn mẫu được định nghĩa. Các cuộc gọi ADL trong đó kiểu đối số được liên kết với chuyên môn từng phần là một ví dụ. Nếu bạn không chuyển tiếp khai báo nó nhưng đã được định nghĩa mẫu chính, mẫu chính sẽ được khởi tạo để thay thế. –

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