【问题标题】:Error: calling a private constructor of class 'std::__1::__wrap_iter<int *>'错误:调用类 'std::__1::__wrap_iter<int *>' 的私有构造函数
【发布时间】:2021-11-08 04:44:31
【问题描述】:

我目前在 Mac (MacOS Big Sur v11.1) 上遇到编译问题。我正在尝试使用 STL 创建一个向量迭代器。但我得到一个错误:

调用类'std::__1::__wrap_iter'的私有构造函数

这是我的代码:

#include <vector>
int range_array[] = {42, 21, 123456, 0, 4, 13};
std::vector<int>::iterator stl_iterator(&(range_array[0]));

这是我的 clang 信息(clang++ -v):

Apple clang version 11.0.3 (clang-1103.0.32.62)
Target: x86_64-apple-darwin20.2.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

【问题讨论】:

  • 是的,没有。你不能像那样滥用标准库。这是什么meant to solve
  • 我有一个学生项目,我必须在其中重新创建一些 STL 容器,包括“vector”,我想将它与真正的 STL 进行比较......

标签: c++ macos vector stl stdvector


【解决方案1】:

首先,如answer from Marshall Clow 中所述,std::vector&lt;int&gt;::iterator 必须指的是 实际 std::vector&lt;int&gt; 中的一个位置(或它的“过去-the-end' 占位符)——但您的 range_array 不是这样的容器。所以,range_array 需要声明为std::vector&lt;int&gt;

其次,虽然std::iterator对象与指针有一些共同点,但它不是指针,不能用元素的地址来初始化。要将其设置为引用向量的第一个元素,请使用 std::vectorbegin() member function

这是您的代码的可能替代方案:

std::vector<int> range_array = { 42, 21, 123456, 0, 4, 13 };
std::vector<int>::iterator stl_iterator{ range_array.begin() };

【讨论】:

    【解决方案2】:

    您正在尝试创建 std::vector&lt;int&gt;::iterator 并对其进行初始化以引用 vector&lt;int&gt; 中未包含的内容。

    您为什么认为这是合理的做法?

    【讨论】:

    • 你的意思是我没有正确的 range_vector 类型?
    猜你喜欢
    • 2020-09-08
    • 2021-08-20
    • 2017-02-05
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 2014-06-11
    • 1970-01-01
    相关资源
    最近更新 更多