C ++ 0x中的元组

试图用Visual Studio 10编译下面的程序,我得到了很多编译错误:

#include "stdafx.h"

#include <tuple>
#include <string>
#include <map>
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
    typedef std::tuple<std::string, std::string> key_t;
    typedef std::map<key_t, std::string> map_t;

    map_t the_map;

    auto k = std::make_tuple("one", "two");
    the_map[k] = "the value";

    auto  q = std::make_tuple("one", "two");

    auto  i = the_map.find(q);
    std::cout << i->second << std::endl;

    return 0;
}

错误1错误C2664:'std :: basic_string <_Elem,_Traits,_Ax> :: basic_string(const std :: basic_string <_Elem,_Traits,_Ax>&)':无法将参数1从'const key_t'转换为'const std :: basic_string <_Elem,_Traits,_Ax>&'c: program files(x86) microsoft visual studio 10.0 vc include tuple 127 1元组

从线上来​​:

std::cout << i->second << std::endl;

奇怪的是,至少从我的角度来看,如果我改变这些线:

auto k = std::make_tuple("one", "two");
the_map[k] = "the value";

the_map[std::make_tuple("one", "two")] = "p";

该程序编译。 所以我的问题当然是为什么? 我想这与make_tuple有关,并且会移动语义 - 但我不明白..


显然这个错误实际上来自the_map[k] = "the value";

当您在地图上使用[]运算符时,该库会尝试创建一个std::pair<Key,Value>对象。 在你的情况下,这成为std::pair<std::tuple<std::string,std::string>,std::string>

但是,如果使用中间变量k ,则调用的std :: pair的构造函数为:(从标准库复制粘贴)

_Pair_base(const _Ty1x& _Val1, _Ty2x&& _Val2)
        : first(_Val1), second(_STD move(_Val2))
        {   // construct from specified values
        }

这个构造函数正试图复制你的key_t。 不幸的是,MSVC ++的元组实现在此时被窃听,并且副本无法编译(另请参阅:C ++ 0x:是否允许元组的元组?)

我可以进行更多的诊断,因为这个实现不仅被窃听,而且非常复杂。

Boost的元组应该可以工作,但是没有<operator,所以你不能使用它们。

目前的“最佳”解决方案是编写the_map.insert(std::make_pair(k, "the value"));


这看起来像VS10中的一个bug,由于某种原因它试图将键类型转换为值类型。

这个简化版本也失败了。

typedef std::map<std::tuple<int, int>, int> map_t;

map_t the_map;

map_t::key_type k = std::make_tuple(1,2);
the_map[k] = 3;

产生以下内容:

错误C2440: 'initializing':无法从'const std :: tr1 :: tuple <_Arg0,_Arg1>'转换为'int'

链接地址: http://www.djcxy.com/p/68419.html

上一篇: tuple in C++0x

下一篇: map where the key is a custom object?