2009-10-08 8 views
10

tôi phải sử dụng một API được cung cấp bởi một DLL với một tiêu đề như thế nàySử dụng một lớp trong không gian tên có cùng tên?

namespace ALongNameToType { 
    class ALongNameToType { 
     static void Foo(); 
    } 
} 

Có cách nào để sử dụng ALongNameToType :: ALongNameToType :: Foo mà không cần phải gõ ALongNameToType :: ALongNameToType mỗi lần? Tôi đã thử sử dụng using namespace ALongNameToType nhưng có lỗi biểu tượng mơ hồ trong Visual Studio. Thay đổi tên không gian tên hoặc loại bỏ nó mang lại cho tôi những lỗi liên kết.

+0

Có thể trùng lặp của [Lớp và không gian tên có cùng tên trong C++] (http://stackoverflow.com/questions/4070915/classes-and-namespaces -sharing-the-same-name-in-c) – jww

Trả lời

20

Tôi không biết những gì mơ hồ, nhưng bạn có thể tránh tất cả các xung đột với các chức năng khác của Foo như sau:

namespace ALongNameToType { 
    struct ALongNameToType { 
     static void Foo(); 
    }; 
} 

typedef ALongNameToType::ALongNameToType Shortname; 

int main() { 
    Shortname::Foo(); 
} 
+0

Tôi quên typedef hoàn toàn ... +1 – AraK

+0

bạn không thực sự phải sử dụng struct thay vì clas s, bạn có ?? – 2am

+2

@ 2 giờ sáng: bạn không cần phải, bạn có thể viết 'class ALongNameToType {public: static void Foo(); }; 'nếu bạn thích, nhưng mã trong câu hỏi cần sửa chữa theo cách này hay cách khác. Tôi thường sử dụng 'struct' cho các loại không có thành viên ngoài công lập. Bạn nên đặt ra các điều kiện để sử dụng 'struct' trong bất kỳ hướng dẫn kiểu nào áp dụng cho mã. Một số người sử dụng 'struct' đặc biệt cho các loại POD, hoặc cụ thể cho các loại có định nghĩa sẽ biên dịch thành C, hoặc đặc biệt cho các kiểu không có hàm tạo hoặc hàm thành viên do người dùng xác định, hoặc chỉ sử dụng nó theo kiểu mà họ coi là" đơn giản ";) –

3
namespace myns = ALongNameToType; 

Có vẻ như bạn không thể bí danh một phạm vi lớp học như thế này:

// second ALongNameToType is a class 
namespace myns = ALongNameToType::ALongNameToType; 

Có lẽ bạn có thể bí danh chức năng nó tự:

namespace foo 
{ 
class foo 
{ 
public: 
    static void fun() 
    { 

    } 
}; 
} 

int main() 
{ 
void (*myfunc)() = foo::foo::fun; 

myfunc(); 
} 
3
using ALongNameToType::ALongNameToType::Foo; 

nếu bạn chỉ muốn sử dụng nó làm Foo().

+0

Làm việc cho tôi trên gcc4. – Bill

+3

Thật không may nó không làm việc cho tôi trong Visual Studio 2008 'lỗi C2885: 'ALongNameToType :: ALongNameToType :: Foo': không phải là khai báo sử dụng hợp lệ ở phạm vi không thuộc lớp ' – Steven

1

Có ba cách để sử dụng using. Một là cho toàn bộ không gian tên, một là dành cho những thứ cụ thể trong một không gian tên, và một là cho một lớp dẫn xuất nói rằng nó không muốn che giấu một cái gì đó được khai báo/định nghĩa trong một lớp cơ sở. Bạn có thể sử dụng thứ hai của những người:

using ALongNameToType::ALongNameToType 

Thật không may điều này không làm việc cho bạn (do sự mơ hồ của không gian tên và các lớp có cùng tên). Kết hợp kiểu này sử dụng với một câu trả lời trước nên thoát khỏi sự mơ hồ:

namespace alntt = ALongNameToType; 
using alntt::ALongNameToType; 

Nhưng một khi bạn đã đổi tên không gian tên, bạn thực sự không cần phải báo cáo kết quả using (miễn là bạn cảm thấy thoải mái viết không gian tên (được rút ngắn) mỗi khi bạn sử dụng lớp học:

namespace alntt = ALongNameToType; 
alntt::ALongNameToType a; 
... 
+0

Điều này cho tôi' lỗi C2874: using- khai báo tạo nhiều khai báo 'ALongNameToType :: ALongNameToType'' trong Visual Studio 2008 – Steven

+0

Ồ, nó hữu ích trong trường hợp không có sự mơ hồ (ví dụ: "using std :: cout"). –