Как вставить пару std :: pair в другую std :: pair? - PullRequest
8 голосов
/ 28 сентября 2010

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

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 ]

17 голосов
/ 28 сентября 2010

Невозможно правильно проанализировать >>> (если у вас нет компилятора 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));
2 голосов
/ 28 сентября 2010

map::insert сам принимает один аргумент std::pair, а не два аргумента. Вы можете привести в порядок код, используя std::make_pair (который выводит аргументы шаблона из аргументов функции), чтобы получить что-то вроде:

reference.insert(std::make_pair("First", 
                                std::make_pair(std::make_pair(-1L,-1L),
                                               std::make_pair(0L,0L))));
2 голосов
/ 28 сентября 2010

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

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

0 голосов
/ 28 сентября 2010

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

Это помогает использовать 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...