gpt4 book ai didi

c++ - 奇怪的错误 - 为什么编译器试图调用复制构造函数?

转载 作者:可可西里 更新时间:2023-11-01 18:39:45 26 4
gpt4 key购买 nike

我遇到了一些非常奇怪的错误。出于某种我不明白的原因,编译器似乎想要调用复制构造函数。

(118) std::map<int, layer> xs;
(119) xs.begin()->first; // error?!

layer 是不可复制的可移动类型。

class layer : public observable
{
layer(const layer&);
layer& operator=(const layer&);
public:
layer(int index = -1);
layer(layer&& other);
layer& operator=(layer&& other);
//...
};

出于某种原因,第 119 行导致编译器尝试为 std::pair 调用复制构造函数,为什么?

1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(131): error C2248: 'layer::layer' : cannot access private member declared in class 'layer'
1> ..\layer.h(55) : see declaration of 'layer::layer'
1> ..\layer.h(53) : see declaration of 'layer'
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(129) : while compiling class template member function 'std::_Pair_base<_Ty1,_Ty2>::_Pair_base(const std::_Pair_base<_Ty1,_Ty2> &)'
1> with
1> [
1> _Ty1=const int,
1> _Ty2=layer
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(174) : see reference to class template instantiation 'std::_Pair_base<_Ty1,_Ty2>' being compiled
1> with
1> [
1> _Ty1=const int,
1> _Ty2=layer
1> ]
1> ..\stage.cpp(119) : see reference to class template instantiation 'std::pair<_Ty1,_Ty2>' being compiled
1> with
1> [
1> _Ty1=const int,
1> _Ty2=layer
1> ]

我还尝试了以下方法,但同样失败了。

(118) std::map<int, layer> xs;
(119) auto& t1 = *xs.begin();
(120) auto& t2 = t1.first; // error?!

这是怎么回事?

最佳答案

这是模板错误的奇怪之处之一。模板代码不是代码,它更接近于生成代码的脚本语言。您甚至可以在函数中出现语法错误,在您的代码(直接或间接)使用该函数之前,该错误不一定会产生编译器错误。

在这种情况下,xs.first() 导致生成 std​​::map ::iterator,这也需要生成 std​​::pair 。 std::pair 的默认实现有一个复制构造函数,无法编译。

您可以使用没有复制构造函数的 std::pair 模板特化来解决这个问题,但是您无法将任何内容插入到您的映射中。 xs[0] = myLayer 创建并插入 std::make_pair<0, myLayer> 到您的 map 中,这显然需要层的复制构造。

典型的解决方案是将类型更改为 std::map >。复制 shared_ptr 不会复制引用的对象。

关于c++ - 奇怪的错误 - 为什么编译器试图调用复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8689331/

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