2010-09-28 22 views
7

मैं इस प्रकार जोड़े की एक जोड़ी के लिए तार का एक नक्शा घोषित कर रहा हूँ:std :: जोड़ी की एक जोड़ी को किसी अन्य std :: जोड़ी के अंदर कैसे सम्मिलित करें?

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

और मैं के रूप में यह प्रारंभ:

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))); 

हालांकि, विजुअल C++ मुझे त्रुटि देता है "C2664, नहीं निर्माता स्रोत प्रकार ले सकता है, या कन्स्ट्रक्टर अधिभार संकल्प संदिग्ध था "।

मैं टेम्पलेट्स और एसटीएल का उपयोग करने के लिए नया हूं और मैं यह नहीं बता सकता कि मैं क्या गलत कर रहा हूं।

+4

यह पठनीय बनाने के लिए typedef की और 'std :: make_pair' का उपयोग करें। – GManNickG

+0

मैंने इसे आंखों पर * थोड़ा * आसान बनाने के लिए इसे दोबारा सुधार दिया। – egrunin

+0

इन सभी 'std :: जोड़ी के घोंसले के बजाय आप' std :: tr1 :: tuple' का उपयोग करने के लिए स्विच नहीं कर सके? बूस्ट में एक ट्यूपल कार्यान्वयन भी है। – Praetorian

उत्तर

16

>>> सही ढंग से पार्स नहीं किया जा सकता है (जब तक आपके पास C++ 0x कंपाइलर न हो)।

> > >

को बदलें इस:

reference.insert("First", 

होना चाहिए:

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

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

इसके अलावा वहां आसान जोड़े के निर्माण करने के लिए एक उपयोगिता समारोह है

किया जा सकता है:

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

इस प्रयास करें:

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

सहायता के लिए धन्यवाद।मैंने प्रश्न को "पार्स" के लिए अधिक आसान बनाने के लिए एल "" को अपने wstring में जोड़ने के लिए संपादित किया। –

+1

मेरा से बेहतर जवाब है, लेकिन ध्यान दें कि 'संदर्भ [कुंजी] = मान' के साथ डालने से 'context.insert (make_pair (key, value))' के लिए अलग-अलग व्यवहार हो सकते हैं; '[]' का उपयोग मौजूदा तत्व को ओवरराइट करेगा, जबकि 'insert' नहीं होगा। –

2

सी ++ लगातार ">" से उलझन में हो जाता है जब आप टेम्पलेट को बंद यह है कि बदलाव ऑपरेटर के रूप में व्याख्या के रूप में।

समापन टेम्पलेट्स, परिवर्तन >>> के बीच रिक्त स्थान जोड़ें>>>

+0

इसके अलावा, जीएमएन की सलाह। – iniju

2

map::insert अपने आप में एक एकल std::pair तर्क के बजाय दो तर्क लेता है। आप std::make_pair का उपयोग कर (जो समारोह तर्क से टेम्पलेट तर्क infers) द्वारा कोड को साफ़ रखने कर सकते हैं, जैसे कुछ पाने के लिए:

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

यह जब बात इस तरह की डिबगिंग typedefs उपयोग करने के लिए मदद करता है।

// 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

ऐसे 'डालने() 'फ़ंक्शन नहीं हैं क्योंकि ओपी उपयोग करने का प्रयास करता है, भले ही आप ' शामिल करें। आपके द्वारा पोस्ट किया गया नमूना कोड काम करता है और काफी पठनीय है, लेकिन क्योंकि आपने 'insert()' को प्रतिस्थापित किया है, जैसा कि आप कहने लगते हैं ... – sth

+0

यदि आप "आपको केवल ' "भाग को हटाते हैं, जो मुझे लगता है कि कुछ हद तक भ्रामक है, मुझे लगता है कि यह * सहायक है और इसे उखाड़ फेंक देगा। – sth

+0

ठीक है, आपको मिल गया। मुझे नहीं पता कि क्या आपको एहसास हुआ है कि आपने अपने जवाब में "कोड पढ़ने के लिए आसान प्रविष्टि के लिए ऑपरेटर [] लिखा था। जैसा कि आप कहते हैं, सम्मिलित नहीं है! – ttt

0

आप एक सहायक समारोह बनाने जोड़े के जोड़े बनाने के लिए अपने कोड को आसान बनाने में कर सकता है, std::make_pair सहायक समारोह है कि मानक पुस्तकालय में उपलब्ध है करने के लिए अनुरूप। इसके अलावा आसान में प्रविष्टि परिणामों के लिए नक्शे operator[] का उपयोग कर कोड को पढ़ने के लिए:

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); 
संबंधित मुद्दे