‘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?

0

Решение

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

std:: вместо std:

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

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

std :: string key; std :: string value; Не было больше «стандартной ошибки».
Зачем??

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

4

Другие решения

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

Итак, вам нужно следующее:

std::string key;

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

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

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

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

#ifndef PARSE_H
#define PARSE_H
2

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

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

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

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

1

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

Вам нужно использовать две двоеточия после 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]);
1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector