c++ - 使用 std::pair 作为 operator= 的参数时的编译问题
问题描述
我被困了几个小时,试图弄清楚为什么以下代码无法编译,如果有人能指出我所缺少的,我将不胜感激。
代码只是我在真实项目代码中遇到的编译问题的简化示例。
#include <map>
#include <string>
#include <utility>
class A
{
public:
A() = default;
A(const A& v) = default;
A(A&& v) = default;
A& operator=(const A& v) = default;
A& operator=(const std::pair<A, A>& v)
{
return *this;
}
};
void func(const std::pair<int, A>& obj);
int main(int argc, char *argv[])
{
std::pair<int, A> obj;
func(obj);
return 0;
}
void func(const std::pair<int, A>& obj)
{
A a, b;
a = b;
}
该问题似乎与"A& operator=(const std::pair<A, A>& v)"相关。让我感到困惑的是,如果我在main()之前移动函数“void func(...)” ,一切都会正确编译。
使用 gcc (C++17) 编译。我得到的错误如下所示:
In file included from /usr/include/c++/7/bits/move.h:54:0,
from /usr/include/c++/7/bits/stl_pair.h:59,
from /usr/include/c++/7/bits/stl_algobase.h:64,
from /usr/include/c++/7/bits/stl_tree.h:63,
from /usr/include/c++/7/map:60,
from main.cpp:1:
/usr/include/c++/7/type_traits: In instantiation of ‘struct std::__and_<std::is_copy_assignable<A>, std::is_copy_assignable<A> >’:
/usr/include/c++/7/bits/stl_pair.h:378:7: required from ‘struct std::pair<A, A>’
/usr/include/c++/7/type_traits:1259:45: required by substitution of ‘template<class _Tp1, class _Up1, class> static std::true_type std::__is_assignable_helper<A&, const A&>::__test<_Tp1, _Up1, <template-parameter-1-3> >(int) [with _Tp1 = A&; _Up1 = const A&; <template-parameter-1-3> = <missing>]’
/usr/include/c++/7/type_traits:1268:40: required from ‘class std::__is_assignable_helper<A&, const A&>’
/usr/include/c++/7/type_traits:1273:12: required from ‘struct std::is_assignable<A&, const A&>’
/usr/include/c++/7/type_traits:1285:12: required from ‘struct std::__is_copy_assignable_impl<A, true>’
/usr/include/c++/7/type_traits:1291:12: required from ‘struct std::is_copy_assignable<A>’
/usr/include/c++/7/type_traits:143:12: required from ‘struct std::__and_<std::is_copy_assignable<int>, std::is_copy_assignable<A> >’
/usr/include/c++/7/bits/stl_pair.h:378:7: required from ‘struct std::pair<int, A>’
<span class="error_line" onclick="ide.gotoLine('main.cpp',23)">main.cpp:23:20</span>: required from here
/usr/include/c++/7/type_traits:143:12: error: incomplete type ‘std::is_copy_assignable’ used in nested name specifier
struct __and_<_B1, _B2>
^~~~~~~~~~~~~~~~
In file included from /usr/include/c++/7/bits/stl_algobase.h:64:0,
from /usr/include/c++/7/bits/stl_tree.h:63,
from /usr/include/c++/7/map:60,
from main.cpp:1:
/usr/include/c++/7/bits/stl_pair.h: In instantiation of ‘struct std::pair<A, A>’:
/usr/include/c++/7/type_traits:1259:45: required by substitution of ‘template<class _Tp1, class _Up1, class> static std::true_type std::__is_assignable_helper<A&, const A&>::__test<_Tp1, _Up1, <template-parameter-1-3> >(int) [with _Tp1 = A&; _Up1 = const A&; <template-parameter-1-3> = <missing>]’
/usr/include/c++/7/type_traits:1268:40: required from ‘class std::__is_assignable_helper<A&, const A&>’
/usr/include/c++/7/type_traits:1273:12: required from ‘struct std::is_assignable<A&, const A&>’
/usr/include/c++/7/type_traits:1285:12: required from ‘struct std::__is_copy_assignable_impl<A, true>’
/usr/include/c++/7/type_traits:1291:12: required from ‘struct std::is_copy_assignable<A>’
/usr/include/c++/7/type_traits:143:12: required from ‘struct std::__and_<std::is_copy_assignable<int>, std::is_copy_assignable<A> >’
/usr/include/c++/7/bits/stl_pair.h:378:7: required from ‘struct std::pair<int, A>’
<span class="error_line" onclick="ide.gotoLine('main.cpp',23)">main.cpp:23:20</span>: required from here
/usr/include/c++/7/bits/stl_pair.h:378:7: error: ‘value’ is not a member of ‘std::__and_, std::is_copy_assignable >’
operator=(typename conditional<
^~~~~~~~
解决方案
您现在所经历的是未定义行为的主要示例,因为std::pair
实现取决于type_traits
未为不完整类型定义的行为。
在任何成员函数的范围内A
但在任何成员函数之外都A
被认为是不完整的类型。您正在尝试定义一个接受 a 的函数std::pair<A, A>
,因此std::pair
使用不完整的类型进行实例化。
如果A
是模板类型,则情况并非如此,因为类模板的函数在实际调用之前不会被实例化。
推荐阅读
- vue.js - 使用 asyncData 进行 Nuxt 分页
- c++ - 激活标签时的鼠标指针位置
- css - 在 Bootstrap 5 中更改手风琴按钮折叠图标颜色
- java - 如何在 Spring Data 存储库中获取默认方法以命中缓存?
- c++ - C5002 1204 自动矢量化原因码是什么意思?
- mysql - 休眠不获取非拥有实体
- python - 如何将 Shopify API json 转换为可读的数据框?
- perl - 如何测试模块是否与 Perl 编译器 (perlcc) 兼容?
- node.js - 在aws中部署node js的方式有哪些?
- selenium - Selenium-side-runner 从 cmd 运行特定的 chrome 配置文件