gpt4 book ai didi

C++ : Why isn't my call to "std::uninitialized_copy" working?

转载 作者:搜寻专家 更新时间:2023-10-31 00:46:41 28 4
gpt4 key购买 nike

我构建了一个简单的类,它应该模仿 std::string 类的功能(作为练习!):

#ifndef _STR12_1_H
#define _STR12_1_H

#include <string>
#include <iostream>

class Str12_1
{
public:

typedef char* iterator;
typedef const char* const_iterator;
typedef long size_type;


Str12_1();
Str12_1(const Str12_1& str);
Str12_1(const char *p);
Str12_1(const std::string& s);

size_type size() const;

//Other member functions


private:
iterator first;
iterator onePastLast;
iterator onePastAllocated;
};

为了避免与"new"相关的开销(并增加我对 <memory> header 的熟悉程度),我选择使用库的分配器模板类来为我的字符串分配内存。这是我在复制构造函数中使用它的示例:

#include <memory>
#include <algorithm>

using std::allocator;
using std::raw_storage_iterator;
using std::uninitialized_copy;


Str12_1::Str12_1(const Str12_1& str)
{
allocator<char> charAlloc;
first = charAlloc.allocate(str.size());
onePastLast = onePastAllocated = first + str.size();
*onePastLast = '\0';

raw_storage_iterator<char*, char> it(first);

uninitialized_copy(str.first, str.onePastLast, it);


}

编译器一直在“uninitialized_copy”行告诉我两个错误,这两个错误都返回到库中的 header ,:

error: invalid conversion from 'char' to 'char*'

error: no match for 'operator!=' in '__first != __last'

问题是我不明白从 char 到 char* 的转换在哪里,以及为什么两个相同类型的指针(str.first、str.onePastLast)不能与“!=”进行比较.

我可以使用“new”,但如前所述,我想练习 <memory> .那么有人可以告诉我为什么这不起作用吗?

最佳答案

查看标准 raw_storage_iterator 并没有将 value_type 类型定义为 T,而是 void:

template <class OutputIterator, class T>
class raw_storage_iterator
: public iterator<output_iterator_tag,void,void,void,void>
^^^^

uninitialized_copy 必须使用该类型定义:

template <class InputIterator, class ForwardIterator>
ForwardIterator uninitialized_copy(InputIterator first, InputIterator last,
ForwardIterator result);

效果:

for (; first != last; ++result, ++first)
::new (static_cast<void*>(&*result))
typename iterator_traits<ForwardIterator>::value_type(*first);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

在您的代码中,在所有替换之后,这导致:

new (...&*result) void (*first);
^^^^^^^^^^^^^
invalid use here

由此您可以得出结论,这两者从未打算一起工作。

如果你想使用 raw_storage_iterator,那么将它传递给 std::copy 应该没问题,因为所有的魔法都发生在 operator=( const T&) 重载。

如果您认为这对于像 char 这样的原语来说是必要的,您可以使用 new char[x] 分配(注意!终止 NUL)并复制strcpy.

关于C++ : Why isn't my call to "std::uninitialized_copy" working?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4868449/

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