gpt4 book ai didi

c++ - GNU C++ : why custom class can not be value type for unordered_map?

转载 作者:太空狗 更新时间:2023-10-29 23:04:47 26 4
gpt4 key购买 nike

我有简单的代码:

#include <cstdio>
#include <unordered_map>
#include <vector>
#include <string>

using namespace std;

class A
{
public:
A(void)
{
}
A(const A &other)
{
}
A &operator=(const A &other)
{
return *this;
}
A(const unordered_map<int, A> &value)
{
}
};

int main(void)
{
A a;
unordered_map<wstring, A> m;
printf("Hello, World!");
return 0;
}

不知何故,GNU C++ 4.8.2 无法编译并显示大量错误;我看到它“不喜欢”构造函数 A(const unordered_map<int, A> &value) .是什么原因? MSVC 编译器可以毫无问题地编译此类代码。 unordered_map 是否有任何 C++ 限制?具有接受另一个构造函数的值类型 unordered_map实例?

最佳答案

这很可能是您使用的版本中的 stdlibc++ 错误。

我在 ubuntu 上使用 gcc 4.8.1 和 clang 3.5 trunk。使用 libc++ 的 clang 没有问题。使用 libstdc++ 的 clang 和 gcc 会触发问题。

对于以下更简单的主函数,您的类型会触发相同的问题:

int main() {
using namespace std;
cout << is_convertible<const A &, A>::value << endl;
}

此外,从使用 std::unordered_map 更改为 std::map,没有问题。

这是更好的 clang 错误日志:

/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/type_traits:117:14: error: base class has incomplete type
: public conditional<_B1::value, _B2, _B1>::type
~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/stl_pair.h:122:19: note: in instantiation of template class
'std::__and_<std::is_convertible<const int &, const int>, std::is_convertible<const A &, A> >' requested here
enable_if<__and_<is_convertible<const _U1&, _T1>,
^
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/stl_pair.h:124:12: note: in instantiation of default argument for
'pair<const int, A>' required here
constexpr pair(const pair<_U1, _U2>& __p)
^~~~
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/stl_pair.h:124:12: note: while substituting deduced template arguments into
function template 'pair' [with _U1 = const int, _U2 = A, $2 = <no value>]
constexpr pair(const pair<_U1, _U2>& __p)
^
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/type_traits:803:24: note: in instantiation of default argument for
'__test<std::pair<const int, A>, const std::pair<const int, A> &>' required here
static true_type __test(int);
^~~~~~~~~~~
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/type_traits:803:24: note: while substituting deduced template arguments into
function template '__test' [with _Tp = std::pair<const int, A>, _Arg = const std::pair<const int, A> &, $2 = <no value>]
static true_type __test(int);
^
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/type_traits:117:14: note: (skipping 10 contexts in backtrace; use
-ftemplate-backtrace-limit=0 to see all)
: public conditional<_B1::value, _B2, _B1>::type
^
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/unordered_map.h:97:27: note: in instantiation of template type alias
'__check_copy_constructible' requested here
class unordered_map : __check_copy_constructible<_Alloc>
^
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/type_traits:1305:42: note: in instantiation of template class
'std::unordered_map<int, A, std::hash<int>, std::equal_to<int>, std::allocator<std::pair<const int, A> > >' requested here
static decltype(__test_aux<_To1>(std::declval<_From1>()), __one())
^
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/type_traits:1306:2: note: while substituting explicitly-specified template
arguments into function template '__test'
__test(int);
^
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/type_traits:1319:11: note: in instantiation of template class
'std::__is_convertible_helper<const A &, A, false>' requested here
__is_convertible_helper<_From, _To>::value>
^
c++1y-sample.cpp:33:13: note: in instantiation of template class 'std::is_convertible<const A &, A>' requested here
cout << is_convertible<const A &, A>::value << endl;
^
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/type_traits:1317:12: note: definition of 'std::is_convertible<const A &, A>' is
not complete until the closing '}'
struct is_convertible

关于c++ - GNU C++ : why custom class can not be value type for unordered_map?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21685284/

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