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 方法返回对该向量的引用。
在 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 中
'::' 的使用无效(第 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)
编译器在解析头文件时没有“看到”头文件string
和vector
。因此,它看不到 std
命名空间和类 vector
和 string
的声明。
【讨论】:
iostream 在提供的头文件中不需要。如果不需要,您不想在标题中包含它们。 是的。我会删除它。复制粘贴是一种危险的工具。【参考方案2】:您忘记在头文件"stringsplit.h"
中至少包含头文件<vector>
。所以编译器会报错,因为它不明白什么是向量。
考虑到字符串文字具有常量数组的类型。所以代替构造函数
SplitString(char *str) : std::string(str)
你应该声明
SplitString(const char *str) : std::string(str)
如果你打算使用字符串字面量。
声明数据成员也没有任何意义
std::vector<std::string> fields;
因为它只用作函数拆分的返回对象,并且每次调用函数时都会被擦除。
如果你简单定义一个拆分字符串的非类函数会更好。
【讨论】:
是的,我可能应该删除类中的场向量。以上是关于g++ 错误:无效使用范围运算符 (::)的主要内容,如果未能解决你的问题,请参考以下文章
caret::predict 给出错误:$ 运算符对原子向量无效
#1139 - 从正则表达式中得到错误“重复运算符操作数无效”
SQL减去两列给出错误-数据类型的运算符无效。运算符等于减法,类型等于nvarchar
消息 443,级别 16,状态 15,过程 myinsert,第 6 行 在函数内对带副作用的运算符 ‘INSERT‘ 的使用无效。