Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将std::pair用作运算符的参数时出现编译问题=_C++_Templates - Fatal编程技术网

C++ 将std::pair用作运算符的参数时出现编译问题=

C++ 将std::pair用作运算符的参数时出现编译问题=,c++,templates,C++,Templates,我花了好几个小时试图弄明白为什么下面的代码不能编译,如果有人能指出我遗漏了什么,我将不胜感激 代码只是我在实际项目代码中遇到的编译问题的一个简化示例 #include <map> #include <string> #include <utility> class A { public: A() = default; A(const A& v) = default; A(A&& v) = default; A&

我花了好几个小时试图弄明白为什么下面的代码不能编译,如果有人能指出我遗漏了什么,我将不胜感激

代码只是我在实际项目代码中遇到的编译问题的一个简化示例

#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()=默认值;
A(常数A&v)=默认值;
A(A&v)=默认值;
A和运算符=(常量A和v)=默认值;
运算符=(常数std::pair&v)
{
归还*这个;
}
};
void func(const std::pair&obj);
int main(int argc,char*argv[])
{
std::对obj;
func(obj);
返回0;
}
void func(常数std::pair&obj)
{
A,b;
a=b;
}
该问题似乎与“A&operator=(const std::pair&v)”有关。让我困惑的是,如果我将函数“void func(…)”移动到main()之前,一切都会正确编译

使用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<
       ^~~~~~~~
在/usr/include/c++/7/bits/move.h:54:0中包含的文件中,
从/usr/include/c++/7/bits/stl_pair.h:59,
从/usr/include/c++/7/bits/stl_algobase.h:64,
从/usr/include/c++/7/bits/stl_tree.h:63,
从/usr/include/c++/7/map:60,
来自main.cpp:1:
/usr/include/c++/7/type_traits:在“struct std::u和_u”的实例化中:
/usr/include/c++/7/bits/stl_pair.h:378:7:必须来自“struct std::pair”
/usr/include/c++/7/type_traits:1259:45:替换“模板静态std::true_type std::__是可分配的_helper::__测试(int)[带_Tp1=A&_Up1=const A&=]”所需
/usr/include/c++/7/type_traits:1268:40:“class std::__是可分配的_helper”中的必填项
/usr/include/c++/7/type_traits:1273:12:必须来自“struct std::is_assignable”
/usr/include/c++/7/type_traits:1285:12:从“struct std::”中需要\u是\u copy\u assignable\u impl'
/usr/include/c++/7/type_traits:1291:12:“struct std::is_copy_assignable”中的必填项
/usr/include/c++/7/type_traits:143:12:必须来自“struct std::u和u”
/usr/include/c++/7/bits/stl_pair.h:378:7:必须来自“struct std::pair”
main.cpp:23:20:从这里开始需要
/usr/include/c++/7/type_traits:143:12:错误:嵌套名称说明符中使用了不完整的类型'std::is_copy_assignable'
结构和_
^~~~~~~~~~~~~~~~
在/usr/include/c++/7/bits/stl_algobase.h:64:0中包含的文件中,
从/usr/include/c++/7/bits/stl_tree.h:63,
从/usr/include/c++/7/map:60,
来自main.cpp:1:
/usr/include/c++/7/bits/stl_pair.h:在“struct std::pair”的实例化中:
/usr/include/c++/7/type_traits:1259:45:替换“模板静态std::true_type std::__是可分配的_helper::__测试(int)[带_Tp1=A&_Up1=const A&=]”所需
/usr/include/c++/7/type_traits:1268:40:“class std::__是可分配的_helper”中的必填项
/usr/include/c++/7/type_traits:1273:12:必须来自“struct std::is_assignable”
/usr/include/c++/7/type_traits:1285:12:从“struct std::”中需要\u是\u copy\u assignable\u impl'
/usr/include/c++/7/type_traits:1291:12:“struct std::is_copy_assignable”中的必填项
/usr/include/c++/7/type_traits:143:12:必须来自“struct std::u和u”
/usr/include/c++/7/bits/stl_pair.h:378:7:必须来自“struct std::pair”
main.cpp:23:20:从这里开始需要
/usr/include/c++/7/bits/stl\u pair.h:378:7:错误:“value”不是“std:”和“std:”的成员,std:”是“copy\u assignable>”
运算符=(typename条件)<
^~~~~~~~

您现在所经历的是未定义行为的一个主要示例,因为
std::pair
实现依赖于未为不完整类型定义的
type\u特征

A
的范围内,但在任何成员函数之外
A
被认为是不完整的类型。您试图定义一个函数,该函数采用
std::pair
,从而用不完整的类型实例化
std::pair


如果
A
是模板化类型,则情况并非如此,因为类模板的函数在实际调用之前不会实例化。

因此,将
运算符=
定义移到类范围之外可以解决此问题?不完全是。您仍然在
A的范围内声明
std::pair
最简单的方法是定义一个自由函数来代替赋值。我明白了。C++从来没有停止过让我吃惊的事。这是一个适当的解决方案,通过在类中添加这行来强制模板实例化吗?“模板类:STD:::对;不,那已经太晚了。您已经实例化了它,而
A
仍然不完整。