2014-12-05 19 views
6

Có khả năng có chỉ thị using có phạm vi giới hạn trong một lớp không?"Sử dụng" khai báo với phạm vi chỉ trên lớp hiện tại?

Lưu ý rằng những gì tôi muốn "sử dụng" không được chứa trong phụ huynh của lớp hiện tại.

Để đơn giản, giả sử các exmple sau:

Một điều thú vị biết là, nếu using chỉ được bao gồm, nếu một tiêu đề được bao gồm:

MyClassFoo.h: 
#include<vector> 

using std::vector; //OK 
class foo 
{ 

} 

Và trong

NewHeader.h 
#include "MyClassFoo.h" 
... 

cách tôi có thể ngăn "using std::vector" thành v có thể ở đây?

+0

Có một khả năng để tạo ra một loại bí danh templated cho "std :: vector ", sau đó được gọi là "vector"? Bằng cách đó, nó sẽ làm giống như những gì tôi muốn sử dụng std :: vector để làm bên trong lớp –

+0

Có, các khai báo 'using' có thể được tạo khuôn mẫu khi tạo các bí danh kiểu, và được gọi là bí danh kiểu' vector' đó nó nằm trong một phạm vi khác từ 'std :: vector'. –

+1

Tôi nghĩ rằng điều đáng nói là đây không phải là * sử dụng chỉ thị *, nó là * sử dụng khai báo *. Sử dụng chỉ thị giới thiệu ** không gian tên **. –

Trả lời

0

Đối với yêu cầu đầu tiên của bạn, bạn có thể sử dụng không gian tên để phạm vi using namespace bị giới hạn ở một lớp duy nhất.

#include<vector> 

namespace FooClasses 
{ 
    using namespace std; //The scope of this statement will NOT go outside this namespace. 

    class foo 
    { 
     vector<int> vecIntVector; 
    }; 

}// namespace FooClasses 

Đối với trường hợp thứ hai của bạn, hãy tận dụng #define#undef một cách khôn ngoan.

3

Vì bạn gắn thẻ C++ 11:

#include<vector> 

class foo 
{ 
    template<typename T> 
    using vector = std::vector<T>; 
}; 
+2

Ngoài ra, 'mẫu sử dụng vector = std :: vector ;' nếu bạn đã từng có * bất kỳ * độ nghiêng nào bằng cách sử dụng trình phân bổ tùy chọn. – WhozCraig

+0

Điều này có vẻ, tốt, nhưng tiếc là nó mang lại cho tôi "tuyên bố/định nghĩa mẫu không thể nhận ra" ?! –

+0

@SH Bạn cần biên dịch với -std = C++ 11 với trình biên dịch đủ gần đây – Drax

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