C++ ‘;标准&x2019;不在函数之前命名类型和预期的初始值设定项

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

下面是我的代码,它试图将字符串“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.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++编译器在 > > <代码>:<代码> >定义为C++中的代码>范围解析< /代码>规则。

< P>命名空间和以下内容之间的分隔符是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]);