如何在另一个std :: pair中插入一对std :: pair?

时间:2010-09-28 14:41:27

标签: c++ templates stl

我正在声明一对字符串映射到一对,如下所示:

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 个答案:

答案 0 :(得分:17)

无法正确解析>>>(除非您有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));

答案 1 :(得分:2)

C ++因连续的“&gt;”而感到困惑关闭模板时,因为它将其解释为移位运算符。

在结束模板之间添加空格,更改&gt;&gt;&gt;到&gt; &GT; &GT;

答案 2 :(得分:2)

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

答案 3 :(得分:0)

在调试此类事物时,有助于使用typedef。

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

答案 4 :(得分: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);