我在C ++中构建了一个简单的split
函数,该函数将使用定界符分割字符串。我将函数放在GP.cpp中,并在GP.h中声明了该函数。
GP.cpp:
#include "GP.h"
#include <vector>
#include <string>
using namespace std;
vector<string> GP::split(string text, string delimiter) {
vector<string> result;
size_t pos;
string token;
while( (pos = text.find(delimiter)) != string::npos ) {
token = text.substr(0, pos);
result.push_back(token);
text.erase(0, pos + delimiter.length());
}
return result;
}
GP.h:
#ifndef GP
#define GP
#include <vector>
#include <string>
using namespace std;
class GP {
public:
static vector<string> split(string text, string delimiter);
};
#endif
我的编辑器将在cpp文件的vector<string>
处进行以下注释:
explicit type is missing ('int' assumed)
当我尝试构建时,出现此错误:
'split': is not a member of 'std::vector<std::string,std::allocator<_Ty>>'
答案 0 :(得分:5)
#define GP
意味着程序中的令牌GP
将被替换为空白。因此,这将转换代码:
class GP {
进入
class {
以及其他导致您出错的情况。
要解决此问题,请让您的包含卫兵使用不太可能与程序中其他令牌冲突的令牌。
将using namespace std;
放在标头中也是一种不好的做法,因为其他使用标头的人都无法撤消它。最好在标头中使用std::
限定。
答案 1 :(得分:3)
展示一个在现代C ++代码中未使用#ifdef
卫队的人。这就是#pragma once
的目的。
您将GP
定义为空字符串,因此标题实际上是这样的:
#include <vector>
#include <string>
using namespace std;
class {
public:
static vector<string> split(string text, string delimiter);
};
我希望现在显而易见的是问题所在。