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>ヘッダーに慣れるため) ために、ライブラリのアロケーター テンプレート クラスを使用して文字列にメモリを割り当てることにしました。コピー コンストラクターでの使用例を次に示します。
#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」行に 2 つのエラーを表示し続けます。どちらもライブラリのヘッダーに戻ります。
error: invalid conversion from 'char' to 'char*'
error: no match for 'operator!=' in '__first != __last'
問題は、char から char* への変換がその行のどこにあるのか、同じ型 (str.first、str.onePastLast) の 2 つのポインターを "!=" と比較できない理由がわからないことです。
「new」も使えますが、前述のとおり、 で練習したいと思い<memory>ます。では、なぜこれが機能しないのか誰か教えてもらえますか?