Как вставить пару 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;
}