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

Posted

技术标签:

【中文标题】g++ 错误:无效使用范围运算符 (::)【英文标题】:g++ error: invalid use of the scope operator (::) 【发布时间】:2015-01-06 15:14:04 【问题描述】:

我正在尝试构建一个类似于 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 string 类和 ISplittable 接口。它实现了 ISplittable 中定义的 split 方法。它还有一个field属性,它是一个string类型的vector,用来存放分割操作后得到的每个token : split 方法返回对该向量的引用。

ma​​in.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 中

'::' 的使用无效(第 4 行) ISO C++ 禁止声明没有类型的“向量”(第 4 行) “向量”声明为“虚拟”字段(第 4 行) 预期的 ';'在“(第 4 行) ',' 标记之前的预期类名(第 7 行) 在类范围内为非成员使用声明(第 13 行)

在构造函数中'SplitString::SplitString()'

'(' 标记之前的预期类名(第 10 行)

在构造函数中'SplitString::SplitString(char *str)'

'(' 标记之前的预期类名(第 11 行)

在'main.cpp'中

“SplitString”类没有名为“split”的成员(第 11 行)

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

【问题讨论】:

如果这是你的全部 stringsplit.h(或者是 splitstring.h,还是 splistring.h?),那么你就缺少了一堆包含和包含保护。 从错误信息来看,确实是这个问题…… 您需要在头文件中包含向量和字符串。编译器如何知道这些类型是什么? 请不要从std::string继承。 实现这一点的更好方法是免费的split() 函数,而不是所有这些虚函数+多重继承混乱。 【参考方案1】:

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

#include <string>
#include <vector>

这个编译器输出的原因:

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

编译器在解析头文件时没有“看到”头文件stringvector。因此,它看不到 std 命名空间和类 vectorstring 的声明。

【讨论】:

iostream 在提供的头文件中不需要。如果不需要,您不想在标题中包含它们。 是的。我会删除它。复制粘贴是一种危险的工具。【参考方案2】:

您忘记在头文件"stringsplit.h" 中至少包含头文件&lt;vector&gt;。所以编译器会报错,因为它不明白什么是向量。

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

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

你应该声明

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

如果你打算使用字符串字面量。

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

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

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

如果你简单定义一个拆分字符串的非类函数会更好。

【讨论】:

是的,我可能应该删除类中的场向量。

以上是关于g++ 错误:无效使用范围运算符 (::)的主要内容,如果未能解决你的问题,请参考以下文章

预测$class 中的错误:$ 运算符对原子向量无效

caret::predict 给出错误:$ 运算符对原子向量无效

#1139 - 从正则表达式中得到错误“重复运算符操作数无效”

R:lts回归:$运算符对原子向量无效

SQL减去两列给出错误-数据类型的运算符无效。运算符等于减法,类型等于nvarchar

消息 443,级别 16,状态 15,过程 myinsert,第 6 行 在函数内对带副作用的运算符 ‘INSERT‘ 的使用无效。