2009-08-04 30 views
28

Trình biên dịch khác nhau dường như có những ý tưởng khác nhau về TR1. G ++ dường như chỉ chấp nhận bao gồm các loại:Làm cách nào để bao gồm TR1?

#include <tr1/unordered_map> 
#include <tr1/memory> 
... 

Trong khi Microsofts trình biên dịch chỉ chấp nhận:

#include <unordered_map> 
#include <memory> 
... 

Đối với như tôi hiểu TR1, cách Microsoft là điều đúng.

Có cách nào để nhận G + + chấp nhận phiên bản thứ hai không? Làm cách nào để xử lý TR1 một cách di động?

+5

TR1 không thực sự là một phần của tiêu chuẩn C++, do đó, cách "đúng" bao gồm các tệp tiêu đề không chuẩn này phải là tranh luận. –

Trả lời

16

Cài đặt tăng trên máy của bạn.
Thêm thư mục sau vào đường dẫn tìm kiếm của bạn.

< Boost Cài đặt thư mục >/tăng/tr1/TR1

xem tại đây để biết chi tiết boost tr1

Bây giờ khi bạn bao gồm < nhớ > bạn sẽ có được phiên bản tr1 bộ nhớ có std :: tr1 :: shared_ptr và sau đó nó bao gồm phiên bản nền tảng cụ thể của < bộ nhớ > để có được tất cả các tính năng thông thường.

+1

+1. Vì TR1 có vẻ là "cho phép nhập các lớp tăng này vào tiêu chuẩn" – KitsuneYMG

+0

Tôi làm '#include" boost/tr1/unordered_map.hpp "' và nó sử dụng thực thi tr1 nếu nó có sẵn –

4

Có lẽ cách tốt nhất là chỉ cần sử dụng boost thư viện, như trong nhiều trường hợp chúng có lựa chọn thay thế với giao diện tương tự đối với các tính năng TR1 và chỉ trong một không gian tên và đường dẫn tiêu đề khác (nhưng nhất quán). Điều này có lợi thế là làm việc trên các trình biên dịch thậm chí không bắt đầu triển khai C++ 0x. Và có rất nhiều thư viện tăng cường hữu ích không có trong TR1 chút nào :)

Cách khác, trên G ++, bạn có thể thử truyền --std = gnu ++ 0x trên dòng lệnh. Điều này làm việc cho < unordered_set> và < unordered_map>, ít nhất. Sau đó, để làm cho nó có sẵn trong tiêu chuẩn :: tr1:

namespace std { namespace tr1 { using namespace std; } } 

Đây là điều ác, tự nhiên. Thay vào đó, tôi khuyên bạn nên sử dụng phương pháp tăng cường này :)

+0

Sử dụng -std = C++ 0x hoặc -std = gnu ++ 0x không hoạt động vì nó sẽ chỉ làm cho std :: unordered_set <> có sẵn, nhưng không phải std :: tr1 :: unordered_set <>. – Grumbel

+0

@Grumbel, cập nhật với một hack ác sẽ làm cho nó có sẵn trong std :: tr1 – bdonlan

3

Tad hack có lẽ, nhưng bạn có thể chỉ cần thêm thư mục tr1 của trình biên dịch vào đường dẫn bao gồm của bạn.

2

Nếu trong Windows, hãy thêm thư mục 'tr1' vào đường dẫn hệ thống. Sau đó, #include <memory> sẽ hoạt động.

+0

làm trình biên dịch trên windows sử dụng đường dẫn hệ thống cũng như đường dẫn bao gồm khi giải quyết bao gồm? –

+0

Không, không. –

2

Tôi đã tự hỏi mình cùng một câu hỏi. Thật không may, báo cáo kỹ thuật không cho biết bao gồm các tiêu đề. Nó chỉ định nghĩa rằng các phần mở rộng phải ở trong không gian tên :: std :: tr1.

12
#ifdef _WIN32 
    #include <unordered_map> 
    #include <memory> 
#else 
    #include <tr1/unordered_map> 
    #include <trl/memory> 
#endif 
+0

Có lẽ bạn nên căn cứ vào trình biên dịch có điều kiện trên trình biên dịch, chứ không phải nền tảng ('_WIN64' là có thật):' #if defined (_MSC_VER) && (_MSC_VER> 1300) ', ví dụ: – IInspectable

+0

Ngày bao gồm lần cuối, tr1 bị sai chính tả là trL;) –

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