#ifndef S_T_R_B_L_O_B
#define S_T_R_B_L_O_B
#include <memory>
#include <vector>
#include <string>
#include <initializer_list>
#include <exception>
class StrBlobPtr {
public:
friend class StrBlob;
StrBlobPtr(): curr(0){};
StrBlobPtr(StrBlob &a, std::size_t d = 0): curr(d), wptr(a.data) { }; //错误的地方
error: expected ')' before '&'
std::string& deref() const;
StrBlobPtr& incur();
private:
std::size_t curr;
std::weak_ptr<std::vector<std::string> > wptr;
std::shared_ptr<std::vector<std::string> >
check(std::size_t, const std::string &) const;
};
std::shared_ptr<std::vector<std::string> >
StrBlobPtr::check(std::size_t i, const std::string &msg) const {
auto ret = wptr.lock();
if(!ret) {
throw std::runtime_error("unbound StrBlobPtr");
}
if(i >= ret->size()) {
throw std::out_of_range(msg);
}
return ret;
}
std::string& StrBlobPtr::deref() const {
auto ret = check(curr, "no");
return (*ret)[curr];
}
StrBlobPtr& StrBlobPtr::incur() {
auto ret = check(curr, "no_up");
++curr;
return *this;
}
class StrBlob {
public:
friend class StrBlobPtr;
typedef std::vector<std::string>::size_type size_type;
StrBlob() : data(std::make_shared<std::vector<std::string>>()) {};
StrBlob(std::initializer_list<std::string> i) : data(std::make_shared<std::vector<std::string>>(1)) {};
size_type size() const {return data->size();};
bool empty() const {return data->empty();};
std::string &front();
const std::string &front() const;
std::string &back();
const std::string &back() const;
/*
StrBlobPtr begin() { return StrBlobPtr(*this); }
StrBlobPtr end() {
auto ret = StrBlobPtr(*this, data->size());
return ret;
}
*/
private:
std::shared_ptr<std::vector<std::string>> data;
void check(size_type i, const std::string &msg) const;
};
void StrBlob::check(size_type i, const std::string &msg) const {
if(i >= data->size()) {
throw std::out_of_range(msg);
}
}
std::string &StrBlob::front() {
check(0, "front on empty StrBlob");
return data->front();
}
const std::string &StrBlob::front() const {
check(0, "front on empty StrBlob");
return data->front();
}
std::string &StrBlob::back() {
check(0, "back on empty StrBlob");
return data->back();
}
const std::string &StrBlob::back() const {
check(0, "front on empty StrBlob");
return data->back();
}
#endif
#endif
std::string& deref() const;
StrBlobPtr& incur();
private:
std::size_t curr;
std::weak_ptr<std::vector<std::string> > wptr;
std::shared_ptr<std::vector<std::string> >
check(std::size_t, const std::string &) const;
};
std::shared_ptr<std::vector<std::string> >
StrBlobPtr::check(std::size_t i, const std::string &msg) const {
auto ret = wptr.lock();
if(!ret) {
throw std::runtime_error("unbound StrBlobPtr");
}
if(i >= ret->size()) {
throw std::out_of_range(msg);
}
return ret;
}
std::string& StrBlobPtr::deref() const {
auto ret = check(curr, "no");
return (*ret)[curr];
}
StrBlobPtr& StrBlobPtr::incur() {
auto ret = check(curr, "no_up");
++curr;
return *this;
}
class StrBlob {
public:
friend class StrBlobPtr;
typedef std::vector<std::string>::size_type size_type;
StrBlob() : data(std::make_shared<std::vector<std::string>>()) {};
StrBlob(std::initializer_list<std::string> i) : data(std::make_shared<std::vector<std::string>>(1)) {};
size_type size() const {return data->size();};
bool empty() const {return data->empty();};
std::string &front();
const std::string &front() const;
std::string &back();
const std::string &back() const;
/*
StrBlobPtr begin() { return StrBlobPtr(*this); }
StrBlobPtr end() {
auto ret = StrBlobPtr(*this, data->size());
return ret;
}
*/
private:
std::shared_ptr<std::vector<std::string>> data;
void check(size_type i, const std::string &msg) const;
};
void StrBlob::check(size_type i, const std::string &msg) const {
if(i >= data->size()) {
throw std::out_of_range(msg);
}
}
std::string &StrBlob::front() {
check(0, "front on empty StrBlob");
return data->front();
}
const std::string &StrBlob::front() const {
check(0, "front on empty StrBlob");
return data->front();
}
std::string &StrBlob::back() {
check(0, "back on empty StrBlob");
return data->back();
}
const std::string &StrBlob::back() const {
check(0, "front on empty StrBlob");
return data->back();
}
#endif[/code]
请问哪里出错了