1

加速 C++,练习 14.5 涉及重新实现一个split函数(将文本输入转换为字符串向量)。std::string必须在类 ( Str)中使用存储输入并使用split函数返回 a Vec<Str>Vec作为std::vector类容器。该类管理一个指向底层Str的自定义指针 ( ) 。PtrVec<char> data

该类在下面Str提供了一个构造函数,该构造函数构造一个底层 当我尝试通过调用 我在出现问题的代码中详述的方法来创建子字符串时,就会出现问题。这是该类的精简版本(如果需要,可以发布更多代码):Str(i,j)Str.hPtrVecstr(i,j)Str

Str.h

#include "Ptr.h"
#include "Vec.h"


class Str {
    friend std::istream& operator>>(std::istream&, Str&);
public:

    // define iterators

    typedef char* iterator;        
    typedef char* const_iterator;  

    iterator begin() { return data->begin(); }
    const_iterator begin() const { return data->begin(); }

    iterator end() { return data->end(); }
    const_iterator end() const { return data->end(); }

    //** This is where we define a constructor for `Ptr`s to substrings **

    template<class In> Str(In i, In j): data(new Vec<char>) {   
      std::copy(i, j, std::back_inserter(*data));
    }

private:
    // store a Ptr to a Vec
    Ptr< Vec<char> > data;
};

Split.h

Vec<Str> split(const Str& str) {
    typedef Str::const_iterator iter;
    Vec<Str> ret;

    iter i = str.begin();
    while (i != str.end()) {

        // ignore leading blanks
        i = find_if(i, str.end(), not_space);

        // find end of next word
        iter j = find_if(i, str.end(), space);

        // copy the characters in `[i,' `j)'
        if (i != str.end()) 
            ret.push_back(**substring**);        // Need to create substrings here
                                                 // call to str(i,j) gives error, detailed below
        i = j;
    }

    return ret;
}

我的第一个想法是使用这个构造函数来创建(指向)所需的子字符串。在这里调用str(i,j)会给出错误消息

type 'const Str' does not provide a call operator
  1. 似乎不能简单地调用str(i,j)这里。为什么不?
  2. 解决方案可以是编写一个Str类似于的成员函数substr吗?
4

0 回答 0