2010-09-28 103 views
7

我声明了地图的字符串的一对对如下:如何在另一个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,我不能告诉我做错了什么。

+4

请使用类型定义的和'的std :: make_pair'使其易读。 – GManNickG 2010-09-28 14:43:13

+0

我重新格式化了它,使它在眼睛上更容易*。 – egrunin 2010-09-28 14:46:51

+0

而不是嵌套所有这些'std :: pair'你不能切换到使用'std :: tr1 :: tuple'? Boost也有一个元组实现。 – Praetorian 2010-09-28 15:09:22

回答

16

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

感谢您的帮助。我编辑了我的问题,将L“”添加到我的wstring中,使问题更容易“解析”。 – 2010-09-28 15:01:52

+1

比我的更好的答案,但请注意,插入'reference [key] = value'可以赋予不同的行为'reference.insert(make_pair(key,value))';'使用'[]'会覆盖现有的元素,而'insert'不会。 – 2010-09-28 15:07:17

2

C++得到由连续“>”混淆,当你关闭模板,因为它解释,作为移位运算符。

添加收盘模板,改变>>>之间的空格>>>

+0

另外,GMan的建议。 – iniju 2010-09-28 14:46:47

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)))); 
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; 
} 
+0

即使你包含'#include ',OP也没有这样的'insert()'函数。您发布的示例代码的工作原理和可读性很好,但是因为您替换了'insert()',而不是因为包含,因为您似乎认为... – sth 2010-09-28 15:06:35

+0

如果您删除“您只需要''”部分,我认为这有点误导,我认为它*是有用的,并会加快它。 – sth 2010-09-28 15:20:58

+0

好的,你明白了。我不知道你是否意识到你在回答中编写了“操作符[]用于插入结果,以便于阅读代码”。正如你所说,插入不存在! – ttt 2010-09-28 15:29:08

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); 
相关问题