gpt4 book ai didi

c++ - 从 std::map 派生的类不能在 Visual C++ 上编译(但可以在 gcc 和 clang 上编译)

转载 作者:搜寻专家 更新时间:2023-10-31 01:29:54 25 4
gpt4 key购买 nike

我正在编写一些包装 std::map 的容器类。一个简化版本,如果是:

#include <map>

template <typename key_type, typename value_type>
class map2 : private std::map<key_type, value_type>
{
public:
void update(const key_type& key, value_type value)
{
(*this)[key] = std::move(value);
}
};

int main()
{
map2<int, int> m;
m.update(1,4);
}

此代码在 gcc 和 clang 上编译得很好,但在 Visual C++ 上(我测试了 2015 版本以及 http://rextester.com/l/cpp_online_compiler_visual 上使用的任何内容)它失败了:

source_file.cpp(16): error C2664: 'void map2<int,int>::update(const int &,std::pair<const _Kty,_Ty>)': cannot convert argument 2 from 'int' to 'std::pair<const _Kty,_Ty>'
with
[
_Kty=int,
_Ty=int
]
source_file.cpp(16): note: No constructor could take the source type, or constructor overload resolution was ambiguous
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x64

所以 Visual C++ 以某种方式假定 value map2::update() 的参数类型为 std::pair<key_type, value_type>而不是 value_type .但为什么它会这样做,而 gcc 和 clang 可以很好地接受我的代码?

最佳答案

问题可能出在 Visual C++ 没有做的事情上,那就是两阶段名称查找。由于名称查找只有一个阶段,因此必须查找 value_type在那个阶段。作为一种 hack,VC++ 已经研究了相关的基类,例如 std::map<key_type, value_type>。这里。

这错误地找到了 std::map<K, V>::value_type , pair<K,V> 的类型定义.这解释了 VC++ 错误消息。

解决方法:消除 map2 中参数名称的歧义你自己。

关于c++ - 从 std::map 派生的类不能在 Visual C++ 上编译(但可以在 gcc 和 clang 上编译),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49050252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com