2010-09-28 42 views
7

Tôi tuyên bố bản đồ về chuỗi để một cặp đôi như sau:Làm thế nào để chèn một cặp std :: cặp bên trong một std :: cặp?

std::map<std::wstring, 
     std::pair<std::pair<long, long>, 
        std::pair<long, long>>> reference; 

Và tôi khởi tạo nó như:

reference.insert(L"First", 
       std::pair<std::pair<long, long>, 
          std::pair<long, long>>(std::pair<long, long>(-1, -1), 
          std::pair<long, long>(0, 0))); 

Tuy nhiên, Visual C++ cung cấp cho tôi những lỗi "C2664, Không constructor có thể lấy kiểu nguồn hoặc độ phân giải quá tải của constructor là mơ hồ ".

Tôi mới sử dụng mẫu và STL và tôi không thể biết mình đang làm gì sai.

+4

Vui lòng sử dụng typedef's và 'std :: make_pair' để dễ đọc. – GManNickG

+0

Tôi đã định dạng lại nó để làm cho nó trở nên dễ dàng hơn * trên mắt. – egrunin

+0

Thay vì lồng tất cả các 'std :: pair' s này, bạn không thể chuyển sang sử dụng' std :: tr1 :: tuple'? Boost cũng có quá trình thực hiện tuple. – Praetorian

Trả lời

16

Không thể phân tích cú pháp chính xác >>> (trừ khi bạn có trình biên dịch C++ 0x).

Thay đổi để > > >

này:

reference.insert("First", 

nên là:

reference.insert(L"First", 
       ^^^ 

Cũng có một chức năng tiện ích để làm cho việc xây dựng các cặp dễ dàng hơn:

std::pair<std::pair<long, long>, std::pair<long, long>>(std::pair<long, long>(-1, -1), std::pair<long, long>(0, 0)) 

thể là:

std::make_pair(std::make_pair(-1L,-1L),std::make_pair(0L,0L)) 

Hãy thử điều này:

reference[L"First"] 
    = std::make_pair(std::make_pair(-1L,-1L),std::make_pair(0L,0L)); 
+0

Cảm ơn sự giúp đỡ.Tôi đã chỉnh sửa câu hỏi của mình để thêm chữ L "" vào chuỗi xâu của tôi để làm cho câu hỏi dễ dàng hơn "phân tích cú pháp". –

+1

Câu trả lời hay hơn của tôi, nhưng lưu ý rằng việc chèn 'tham chiếu [khóa] = giá trị' có thể cung cấp hành vi khác nhau cho' reference.insert (make_pair (khóa, giá trị)) '; sử dụng '[]' sẽ ghi đè lên một phần tử hiện có, trong khi 'chèn' sẽ không. –

2

C++ bị nhầm lẫn bởi những liên tiếp ">" khi bạn đóng mẫu như nó diễn giải rằng khi các nhà điều hành chuyển đổi.

Thêm khoảng trống giữa việc đóng cửa các mẫu, thay đổi >>> đến>>>

+0

Ngoài ra, lời khuyên của GMan. – iniju

2

map::insert bản thân mất một std::pair đối số duy nhất, chứ không phải hai đối số. Bạn có thể dọn dẹp mã bằng cách sử dụng std::make_pair (mà suy luận các đối số mẫu từ các đối số chức năng), để có được một cái gì đó như:

reference.insert(std::make_pair("First", 
           std::make_pair(std::make_pair(-1L,-1L), 
               std::make_pair(0L,0L)))); 
0

Nó giúp để sử dụng typedefs khi gỡ lỗi các loại điều này.

// test1.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 

#include <map> 
#include <string> 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    typedef std::pair<long, long> ElementType; 
    typedef std::pair<ElementType, ElementType> ValueType; 
    typedef std::wstring KeyType; 
    std::map<KeyType, ValueType> reference; 

    KeyType key = L"First"; 
    reference[key] = ValueType(ElementType(-1, -1), ElementType(0, 0)); 

    return 0; 
} 
+0

Không có hàm 'insert()' như OP cố gắng sử dụng, ngay cả khi bạn '#include '. Mã mẫu bạn đã đăng hoạt động và khá dễ đọc, nhưng vì bạn đã thay thế 'insert()', không phải vì bao gồm như bạn muốn nói ... – sth

+0

Nếu bạn loại bỏ phần "bạn chỉ cần" ", mà tôi nghĩ là có phần gây hiểu lầm, tôi nghĩ rằng nó * là * hữu ích và sẽ upvote nó. – sth

+0

ok, bạn đã hiểu. Tôi không biết nếu bạn nhận ra bạn đã viết "toán tử [] để chèn kết quả trong dễ dàng hơn để đọc mã" trong câu trả lời của bạn. Như bạn nói, chèn không tồn tại! – ttt

0

Bạn có thể đơn giản hóa mã của bạn bằng cách tạo ra một hàm helper để tạo ra cặp đôi, tương tự như chức năng std::make_pair helper mà có sẵn trong thư viện chuẩn. Cũng sử dụng bản đồ operator[] để chèn kết quả dễ dàng hơn để đọc mã:

template<typename T, typename U, typename V, typename W> 
std::pair< std::pair<T,U>, std::pair<V,W> > make_pair_pair(T t, U u, V v, W w) { 
    // using std::make_pair instead of the constructor for better readability 
    return std::make_pair(std::make_pair(t, u), std::make_pair(v, w)); 
} 

reference[L"First"] = make_pair_pair(1,2,3,4); 
Các vấn đề liên quan