g ++错误:无效使用范围运算符(::)

时间:2015-01-06 15:14:04

标签: c++ class templates scope stdvector

我尝试构建一个类似于STL中定义的基本字符串类,但是使用一种方法来处理拆分操作。这是代码:

//The header file "splitstring.h" for the interface
class ISplittable
{
    public:
        virtual std::vector<std::string> &split(char delim, bool rep = false) = 0;
};

class SplitString : public std::string, public ISplittable
{
    public:
        SplitString() : std::string() {}
        SplitString(char *str) : std::string(str) {}
        std::vector<std::string> &split(char delim, bool rep = false);
    private:
        std::vector<std::string> fields;
};

//The CPP file that provides the implementantion
#include "splitstring.h"
#include <string>
#include <vector>

std::vector<std::string> &SplitString::split(char delim, bool rep)
{
    if(!fields.empty()) fields.clear();    //clear the vector if it's needed.
    std::string work = this->data();       //save the original string in a temp variable.
    std::string buf = "";                  //buf serves as an accumulator to work with each token separately.
    int i = 0;

    while(i < work.length()) {             //split the original string into tokens and pushes them back in the vector.
        if(work[i] != delim)
            buf += work[i];
        else if(rep == 1) {
            fields.push_back(buf);
            buf = "";
        } else if(buf.length() > 0) {
            fields.push_back(buf);
            buf = "";
        }
        i++;
    }

    if(!buf.empty())
        fields.push_back(buf);
    return fields;
}

ISplittable 接口提供了 split 方法,该方法采用分隔符(应该拆分字符串的字符)和布尔参数,该参数指定拆分操作应该重复多次;默认情况下, rep 参数设置为 false

SplitString 类继承自STL 字符串类和 ISplittable 接口。它实现了在 ISplittable 中定义的 split 方法。它还有字段属性,它是 string 类型的向量,它用于存储已获取的每个标记在拆分操作之后: split 方法返回对此向量的引用。

main.cpp 文件中,我只是尝试创建 SplitString 类的实例并调用其 split 方法:

//The main.cpp file
#include "splitstring.h"
#include <iostream>

using namespace std;

int main()
{
    SplitString str = "Lorem ipsum dolor sit amet";
    cout << str << endl;

    vector<string> fld = str.split(' ');    //Splits the string at every space.
    for(int i = 0; i < fld.size(); i++)
        cout << fld[i] << endl;

    cin.get();
    return 0;
}

但是当我尝试编译代码时,g ++告诉我:

  

在文件splitstring.h中

     

无效使用&#39; ::&#39; (第4行)
  ISO C ++禁止声明&#39; vector&#39;没有类型(第4行)
  &#39;矢量&#39;宣称为虚拟&#39; field (第4行)
  预期&#39;;&#39;之前&#39;&lt;&#39;令牌(第4行)
  预期的类名称是&#39;,&#39;令牌(第7行)
  类成员范围内非成员的使用声明(第13行)

     

在构造函数&#39; SplitString :: SplitString()&#39;

中      

&#39;之前的预期班级名称(&#39;令牌(第10行)

     

在构造函数&#39; SplitString :: SplitString(char * str)&#39;

     

&#39;之前的预期班级名称(&#39;令牌(第11行)

     

在&#39; main.cpp&#39;

     

class&#39; SplitString&#39;没有名为&#39; split&#39; (第11行)

我在网站上搜索过类似的问题,但没有找到任何可以满足我需求的东西。 我真的无法看到问题所在。根据错误消息,我猜有某种错误范围有关。如果你们中的任何人能告诉我这段代码有什么问题以及如何修复它,我将不胜感激。

2 个答案:

答案 0 :(得分:0)

尝试将这些行从splitstring.cpp移至splitstring.h

#include <string>
#include <vector>

此编译器输出的原因:

Invalid use of '::' (line 4)
ISO C++ forbids declaration of 'vector' with no type (line 4)

是编译器没有&#34;&#34;看&#34;解析头文件时头文件stringvector。因此,它没有看到std命名空间和类vectorstring的声明。

答案 1 :(得分:0)

您忘记在标头文件<vector>中至少包含标题"stringsplit.h"。所以编译器会发出错误,因为它不知道什么是vector。

考虑到字符串文字具有常量数组的类型。所以不是构造函数

SplitString(char *str) : std::string(str) {}

你shpuld声明

SplitString(const char *str) : std::string(str) {}

如果你打算使用字符串文字。

声明数据成员

也没有任何意义
std::vector<std::string> fields;

因为它只用于函数拆分的返回对象,每次调用函数时都会被删除。

如果你只是定义一个分割字符串的非类函数会更好。