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)
我在网站上搜索过类似的问题,但没有找到任何可以满足我需求的问题。
实在看不出问题出在哪里。根据错误消息,我猜想有某种 error 与 scope 有关。拜托,如果你们中的任何人能告诉我这段代码有什么问题以及如何修复它,我将不胜感激。
尝试将这些行从 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"头文件string
和vector
。因此,它看不到 std
命名空间和 类 vector
和 string
.
的声明
您忘记在头文件 "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分割字符串的函数会更好
我正在尝试构建一个基本字符串 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)
我在网站上搜索过类似的问题,但没有找到任何可以满足我需求的问题。 实在看不出问题出在哪里。根据错误消息,我猜想有某种 error 与 scope 有关。拜托,如果你们中的任何人能告诉我这段代码有什么问题以及如何修复它,我将不胜感激。
尝试将这些行从 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"头文件string
和vector
。因此,它看不到 std
命名空间和 类 vector
和 string
.
您忘记在头文件 "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分割字符串的函数会更好