当前位置: 首页 > 知识库问答 >
问题:

c value_type不适用于std::map中的std::tr1:tuple

沈淇
2023-03-14

以下代码片段适用于Visual Studio 2008,但不适用于Visual Studio 2010。

template <typename TKey>
struct MyStruct
{
    typedef std::map<TKey, int>  Keys;

    MyStruct()
    {
    }

    void set(TKey& key)
    {
#if 1
        // This works with VS 2008 but not with 2010
        keys_.insert(typename Keys::value_type(key, 1));
#else
        // This works with VS 2008 and VS 2010
        keys_.insert(std::pair<TKey, int>(key, 1));
#endif
    };

private:
    Keys keys_;
};

用法

typedef std::tr1::tuple<int, int> MyValueType;
MyStruct<MyValueType> a;
MyValueType x;
a.set(x);

我得到以下错误:

1个

如果用typedef int MyValueType替换typedef STD::tr1::tuple myvalue type,则有效。

提前感谢您。

共有1个答案

王凯旋
2023-03-14

我认为这是一个与MSVC 2010移动语义的糟糕实现有关的错误,因为您可以成功编译以下代码:

typename Keys::value_type v( key, 1 );
keys_.insert(v);
 类似资料:
  • https://godbolt.org/z/P97MaK 我玩的概念和预期d::is_equality_comparable工作矢量,但它没有。 编译错误在 内部失败,而不是在受概念保护的函数边界处失败。 这是错误还是预期行为?

  • 问题内容: 我正在寻找具有C ++ std :: map的通常实现特征的Java类(据我了解,这是一个自平衡二进制搜索树): 插入/删除/搜索的O(log n)性能 每个元素均由唯一键和映射值组成 按键遵循严格的弱顺序 我正在寻找带有开源或设计文档的实现;我可能最终会放弃对原始键/值的支持。 这个问题的风格类似于:std :: deque的Java等效 ,其答案是“ Java Primitive

  • 问题内容: 是否有与C ++等效的Java Map keySet()? Java 方法返回“此映射中包含的键的设置视图”。 问题答案: 也许以下可能有用: 使用STL兼容序列(例如std :: vector,std :: deque或std :: list)的 make_key_set 函数的重载可以如下所示:

  • 我在理解条件变量及其在互斥体中的使用时遇到了一些困难,我希望社区能帮助我。请注意,我来自win32背景,因此与CRITICAL_SECTION、HANDLE、SetEvent、WaitForMultipleObject等一起使用。 这是我第一次尝试使用C++11标准库进行并发操作,它是在这里找到的一个程序示例的修改版本。 关于这个的几个问题。 我读过“任何要等待std::condition_var

  • 在我的Fedora 34环境(g)中,定义为: 如果表达式已经是右值,那么

  • 我想知道为什么std::map和std::set使用std::less作为比较键的默认函子。为什么不使用一个类似strcmp的函子呢?类似于: 假设地图中有两个对象,分别是键1和键2。现在,我们要插入另一个具有键3的对象。 如果使用,那么只需一个调用就有足够的信息来做出正确的决定。 根据映射中键的类型,可能很昂贵。 除非我缺少一些非常基本的东西,否则不应该使用类似于比较的东西,而不是作为比较键的默