我構建應該模仿std :: string類的功能的簡單類(作爲練習!):C++:爲什麼我不打電話給「std :: uninitialized_copy」工作?
#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;
};
爲了避免與相關聯的開銷「新」(和增加我熟悉<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」線,既引回庫中的頭兩個錯誤,:
error: invalid conversion from 'char' to 'char*'
error: no match for 'operator!=' in '__first != __last'
問題是我不明白char到char *的轉換是什麼,以及爲什麼兩個相同類型的指針(str.first,str.onePastLast)不能與「!=」進行比較。
我可以使用「新」,但如前所述,我想與<memory>
練習。那麼有人可以告訴我爲什麼這不起作用嗎?
默認分配器只是在引擎蓋下調用`new`。它沒有魔法。它允許用戶通過提供不同的分配器來定製內存分配策略。但是默認的和'new`完全相同。只是想你可能想知道,即使它不回答你的問題:) – jalf 2011-02-01 22:02:28
你確定嗎?我從Accelerated C++和其他在線資源中收集到的是,「new」在分配空間後調用類型的默認構造函數,而「.allocate」則不會。 – Kevin 2011-02-01 22:28:34