Как вставить пару std::pair внутри другой пары std:: pair?

Я объявляю отображение строки на пару пар следующим образом:

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

однако Visual C++ дает мне ошибку "C2664, ни один конструктор не может принять тип источника, или разрешение перегрузки конструктора было неоднозначным".

Я новичок в использовании шаблонов и STL, и я не могу сказать, что я делаю неправильно.

5 ответов


на >>> не может быть правильно проанализирован (если у вас нет компилятора C++0x).

заменить на > > >

это:

reference.insert("First",

должно быть:

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

можно:

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

C++ путается последовательным " > " при закрытии шаблона, поскольку он интерпретирует это как оператор shift.

добавить пробелы между закрывающими шаблонами, изменить >>> на > >>


принимает


вы можете упростить свой код, создав вспомогательную функцию для создания пар пар, аналоговых 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);

это помогает использовать 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;
}