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

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

吴兴国
2023-03-14

我被困了几个小时,试图找出为什么以下代码无法编译,如果有人能指出我错过了什么,我将不胜感激。

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

#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”有关

使用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<
       ^~~~~~~~

共有1个答案

苏高远
2023-03-14

您现在正在经历的是未定义行为的一个主要示例,因为std::对实现依赖于type_traits,而这些不是为不完整的类型定义的。

在A的范围内,但在任何成员函数之外,A被视为不完整类型。您正在尝试定义一个函数,该函数采用std::pair

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

 类似资料:
  • 我不熟悉<code>std::map</code>,最近才开始使用它。 我遇到了其中一个映射的编译问题。 我有一个自定义结构,并试图用该结构类型的对象创建一个< code>CString的映射。 不幸的是,我遇到了问题

  • 我想使用部分模板专门化,以便将数组(在编译时创建)“分解”为由其值组成的参数包(以便与我在代码中定义的其他结构接口)。以下内容(我的第一次尝试)不编译 因为模板参数不得涉及模板参数。正如我所理解的,在部分模板专门化中提供非类型参数是不可能的,如果它们不是非常依赖于模板参数的话。因此,我试图通过在类型中包含值来解决这个问题: 我使用并通过,因为我使用非类型模板参数,所以需要c++2a。 在我的实际代

  • 我一直在互联网上努力研究如何在编译成可运行的jar后显示图像图标。我发现这个问题太晚了,我以前在eclipse中运行过很多次程序,一切都正常,现在6个月后项目完成了,我用eclipse编译了我的程序,没有音频或图像工作。在网上阅读,它说关于图片文件夹的位置应该在罐子里,但我的没有放在那里? 我在源文件夹中移动了图片文件夹,但它不起作用。我有一种感觉,这可能与资源的路径有关。。。但这只是猜测。 我已

  • 我只是想测试JAVACPP并尝试了我的eclipse中网页中的第一个示例: http://code.google.com/p/javacpp/(Legacyclass和Legacy库) 我一打字: javac-cp libs\javacpp.jar:. src\LegacyLibrary.java 在命令行中,我得到以下错误消息: src\LegacyLibrary.java: 1:错误:包com

  • 下面的代码抛出编译错误,请建议如何克服,因为我已经在其中放置了条件运算符 我遇到的编译错误就在这一行 编译错误为 未为参数类型doubles null定义运算符==

  • 问题内容: 我想使用更新版本的l2switch插件,但是当我尝试编译项目时,出现以下错误: 我认为问题不在我的.m2文件夹中,因为我能够正确地编译Openflowplugin项目。另外我正在使用Java 8.0,我的操作系统是Windows 10(我正在使用Maven插件通过提示符进行编译)我正在使用的命令是mvn clean install -U -DskipTests ps:我还没有编辑l2s