2013-11-10 3 views
0

ниже - это мой код, который пытается отделить строку «ключ = значение» от двух подмассивов «ключ» и «значение», и вот ошибки:«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; 

Там больше не было ошибок "станд". Зачем??

Почему инициализатор ожидается перед строкой2StringPair? Я, хотя у меня уже был один: StringPair?

+1

'std :: string', а не' std: string'. И я бы предложил не использовать 'using namespace std;' вообще. – lapk

+0

Это не проблема, но имена, содержащие два последовательных символа подчеркивания ('__PARSE_H_') и имена, начинающиеся с символа подчеркивания, за которым следует заглавная буква, зарезервированы для реализации. Не используйте их. –

+0

@PeteBecker На самом деле, ** ** является одной из проблем - любая программа, использующая те (вне реализации), имеет неопределенное поведение. –

ответ

3

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

std:: вместо std:

EDIT

When I changed to

std::string key; std::string value; There was not more "std" error. Why??

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

2

Разделитель между пространством имен и следующим образом представляет собой два символа двоеточия в C++.

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

std::string key; 

Или, так как вы говорите using namespace std, вы могли бы на самом деле опустить префикс std:: вообще. Однако using namespace std - not considered good coding practice.

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

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

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

#ifndef PARSE_H 
#define PARSE_H 
1

зЬй :: и не StD: //note :: is two times.

Если вы используете патезрасе, нет необходимости в использовании "СТД ::" в любом случае. Выберите один из вариантов программирования.

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

«::» используется для доступа к статическим переменным и методам класса/структуры или пространства имен. Он также обычно используется для доступа к переменным и функциям из другой области.Почистите основы на 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. 

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

pair = string2StringPair(argv[1]); 
Смежные вопросы