C++ ‘;标准&x2019;不在函数之前命名类型和预期的初始值设定项
下面是我的代码,它试图将字符串“key=value”分为两个子数组“key”和“value”,下面是错误: string2StringPair.cc:9:3:错误:“std”未命名类型; string2StringPair.cc:10:3:错误:“std”未命名类型; string2StringPair.cc:13:12:错误:“string2StringPair”之前应为初始值设定项C++ ‘;标准&x2019;不在函数之前命名类型和预期的初始值设定项,c++,string,associative,C++,String,Associative,下面是我的代码,它试图将字符串“key=value”分为两个子数组“key”和“value”,下面是错误: string2StringPair.cc:9:3:错误:“std”未命名类型; string2StringPair.cc:10:3:错误:“std”未命名类型; string2StringPair.cc:13:12:错误:“string2StringPair”之前应为初始值设定项 #ifndef __PARSE_H_ #define __PARSE_H_ #include "cppstd
#ifndef __PARSE_H_
#define __PARSE_H_
#include "cppstd.hh"
#include <string>
using namespace std;
struct StringPair{
std:string key;
std:string value;
}
StringPair string2StringPair (char* str[]){
std:string x, y;
x = ""; y = "";
for (int i=0;i<str.length();i++){
if str[i]=="="{
for (int j=0;j<i;j++){
x=x+str[j];
}
for (int k=(i+1);k<str.length();k++){
y=y+str[k];
}
break;
}
}
if ((x=="") && (y=="")){
cout<<"ERROR: There is no = in the input string!"<<endl;
}
StringPair tmp;
tmp.key = x;
tmp.value = y;
return tmp;
}
#endif
int main(int argc, char *argv[]){
StringPair pair;
pair.string2StringPair(argv[1]);
cout<<"The pair is "<<pair<<endl;
return 0;
}
没有更多的“std”错误。为什么
为什么在string2StringPair之前需要初始值设定项?我想我已经有了一个:StringPair?你错过了这个
:
std::
而不是std:
编辑
当我换成
std::字符串键;std::字符串值;没有更多的“std”错误。
为什么
<> >由于C++编译器在
std::string key;
或者,由于您说的是使用名称空间std
,因此实际上可以完全省略std::
前缀。但是,使用命名空间std的是不正确的
长话短说:使用名称空间std删除代码>并使用std::
前缀
另外,对于include-guard,不要使用带有双下划线(甚至是单下划线)的标识符。对于C++标准中标识符保留的下划线有相当严格的规则。虽然使用它们时您可能会逃脱惩罚,但这绝对是不推荐的
只用
#ifndef PARSE_H
#define PARSE_H
std::而非std://注意::是两倍。
如果您使用的是名称空间std,那么无论如何都不需要使用“std::”。选择一种编程约定
至于您编辑的问题,为什么在使用以下命令后不再出现错误:
“::”用于访问类/结构或命名空间的静态变量和方法。它还通常用于从另一个作用域访问变量和函数。复习C++的基础知识,否则你越难学。 有很多错误。
您需要在使用std的地方使用两个冒号
struct
声明后面必须跟一个分号
struct StringPair {
std::string key;
std::string value;
}; // <-- add semi-colon here
您需要使用str.size()
获取字符串的长度,字符比较使用单引号,而不是双引号
for (int i=0 ; i< str.size();i++){ // use str.size()
if(str[i] == '=') { // "=" is a string. '=' is a single character.
std:string
,而不是std:string
。我建议不要使用名称空间std代码>。这不是问题所在,但包含两个连续下划线(\uuu PARSE\u H\uu
)的名称和以下划线开头并后跟大写字母的名称保留给实现。不要使用它们。@PeteBecker实际上,这是问题之一——任何使用它们的程序(在实现之外)都有未定义的行为。@H2CO3-这里不是问题所在。未定义的行为并不意味着一定会发生坏事。正如其他人所指出的,问题在于缺少一个“:”。
StringPair string2StringPair (std::string str){
for (int i=0 ; i< str.size();i++){ // use str.size()
if(str[i] == '=') { // "=" is a string. '=' is a single character.
pair = string2StringPair(argv[1]);