‘std’ не называет тип и ожидаемый инициализатор перед функцией

ниже мой код, который пытается разделить строку «ключ = значение» на два подмассива «ключ» и «значение», и вот ошибки:

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::string key; 
std::string value;

Больше ошибки "std" не было. Почему??

Почему инициализатор ожидается перед string2StringPair? Хотя у меня уже был один: StringPair?


person user2969181    schedule 10.11.2013    source источник
comment
std::string, а не std:string. И я бы посоветовал вообще не использовать using namespace std;.   -  person lapk    schedule 10.11.2013
comment
Это не проблема, но имена, содержащие два последовательных символа подчеркивания (__PARSE_H_), и имена, начинающиеся с символа подчеркивания, за которым следует заглавная буква, зарезервированы для реализации. Не используйте их.   -  person Pete Becker    schedule 10.11.2013
comment
@PeteBecker На самом деле, это это одна из проблем - любая программа, использующая их (вне реализации), ведет себя неопределенно.   -  person    schedule 10.11.2013
comment
@ H2CO3 - здесь не проблема. Неопределенное поведение не означает, что должно произойти что-то плохое. Проблема, как указывали другие, заключается в отсутствии «:».   -  person Pete Becker    schedule 10.11.2013


Ответы (4)


Вы пропустили это :

std:: вместо std:

РЕДАКТИРОВАТЬ

Когда я изменился на

std::строковый ключ; std::строковое значение; Больше ошибки "std" не было. Почему??

Поскольку компилятор C++ ожидает еще : после : в соответствии с определением правил scope resolution в стандартах C++.

person Aniket Inge    schedule 10.11.2013

Разделителем между пространством имен и тем, что следует за ним, является два символа двоеточия в C++.

Итак, вам понадобится следующее:

std::string key;

Или, поскольку вы говорите using namespace std, вы могли бы вообще опустить префикс std::. Однако using namespace std не считается хорошей практикой кодирования.

Короче говоря: удалите префикс using namespace std; и используйте префикс std::.

Кроме того, для защиты включения не используйте идентификаторы с двойным подчеркиванием (или даже с одним подчеркиванием). В стандарте С++ существуют довольно строгие правила относительно начальных символов подчеркивания в идентификаторах, зарезервированных. Хотя вы можете избежать их использования, это определенно не рекомендуется.

Просто используйте

#ifndef PARSE_H
#define PARSE_H
person codeling    schedule 10.11.2013

std:: а не std: //note :: is two times.

Если вы используете пространство имен std, в любом случае нет необходимости использовать «std::». Выберите одно соглашение о программировании.

Что касается вашего отредактированного вопроса, почему после использования:: ошибки больше нет,

«::» используется для доступа к статическим переменным и методам класса/структуры или пространства имен. Он также обычно используется для доступа к переменным и функциям из другой области. Освежите в памяти основы C++, иначе чем дальше вы будете продвигаться, тем сложнее будет.

person rockinfresh    schedule 10.11.2013

Есть ряд ошибок.

Вам нужно использовать два двоеточия после std там, где вы его используете.

Объявления struct должны сопровождаться точкой с запятой.

struct StringPair {
    std::string key;
    std::string value;
};  // <-- add semi-colon here

Вы хотели использовать std::string в качестве входных данных для string2StringPair(), поскольку вы используете str как объект в этой функции.

StringPair string2StringPair (std::string str){

Вам нужно использовать str.size(), чтобы получить длину строки, а при сравнении символов использовать одинарные, а не двойные кавычки.

for (int i=0 ; i< str.size();i++){  // use str.size() 
    if(str[i] == '=') {          // "=" is a string.  '=' is a single character.

В вашей функции main() вы хотели присвоить результат string2StringPair() в pair. pair не имеет методов для вызова.

pair = string2StringPair(argv[1]);
person Phillip Kinkade    schedule 10.11.2013