g++ error: invalid use of the scope operator (::)

g++ error: invalid use of the scope operator (::)

我正在尝试构建一个基本字符串 class,就像在 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.

SplitStringclass继承自STLstringclass和ISplittable 界面。它实现了在 ISplittable 中定义的 split 方法。它还有一个 field 属性,它是一个 vector 类型 string,它用于存储每个拆分操作后获得的令牌:然后通过 split 方法返回对该向量的引用。

main.cpp 文件中,我只是尝试创建 SplitString class 的实例并调用它的 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++ 告诉我:

In file splitstring.h

Invalid use of '::' (line 4)
ISO C++ forbids declaration of 'vector' with no type (line 4)
'vector' declared as a 'virtual' field (line 4)
expected ';' before '<' token (line 4)
expected class-name before ',' token (line 7)
using-declaration of for non-member at class scope (line 13)

In constructor 'SplitString::SplitString()'

expected class-name before '(' token (line 10)

In constructor 'SplitString::SplitString(char *str)'

expected class-name before '(' token (line 11)

In 'main.cpp'

class 'SplitString' has no member named 'split' (line 11)

我在网站上搜索过类似的问题,但没有找到任何可以满足我需求的问题。 实在看不出问题出在哪里。根据错误消息,我猜想有某种 errorscope 有关。拜托,如果你们中的任何人能告诉我这段代码有什么问题以及如何修复它,我将不胜感激。

尝试将这些行从 splitstring.cpp 移动到 splitstring.h:

#include <string>
#include <vector>

此编译器输出的原因:

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

是编译器在解析你的头文件时没有"see"头文件stringvector。因此,它看不到 std 命名空间和 类 vectorstring.

的声明

您忘记在头文件 "stringsplit.h" 中至少包含头文件 <vector>。所以编译器报错是因为死活不明白什么是vector。

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

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

你应该申报

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

如果您要使用字符串文字。

而且声明数据成员也没有任何意义

std::vector<std::string> fields;

因为它只像 return 函数 split 的对象一样使用,每次调用函数时它都会被删除。

如果简单地定义一个非class分割字符串的函数会更好