2013-08-09 6 views
-1

Я немного новичок в C++ и с использованием Linux-платформы с g ++ в качестве компилятора. Соединение из трех вышеизложенных оставило меня погрязшим.Нужна помощь в сортировке ошибок

Вот (очень простая) программа:

#include<iostream> 
#include<string.h> 
#include<stdlib.h> 

using namespace std; 

class string 
{ 
private: 
    char str[20]; 
public: 
    string() 
    { 
     str[0]='\0'; 
    } 
    string(char*s) 
    { 
     strcpy(str,s); 
    } 
    string(int a) 
    { 
     itoa(a,str,10); 
    } 
    operator int()//overloaded cast operator,converts string to int 
    { 
     int i=0,l,ss=0,k=1; 
     for(i=strlen(str)-1;i>=0;i--) 
     { 
      ss=ss+(str[i]-48)*k; 
      k=k*10; 
     } 
     return ss; 
    } 
    void displayData() 
    { 
     cout<<str; 
    } 
}; 

int main() 
{ 
    string s1=123; 
    cout<<endl<<"s1="; 
    s1.displayData(); 

    s1=150; 
    cout<<endl<<"s1="; 
    s1.displayData(); 

    string s2("123"); 
    int i=int(s2); 
    cout<<endl<<"i="<<i; 

    string s3("456"); 
    i=s3; 
    cout<<endl<<"i="<<i; 
} 

Ошибки я получаю

[email protected] ~/Desktop/C++ $ g++ int2string.cpp -o int2string 
int2string.cpp: In constructor ‘string::string(int)’: 
int2string.cpp:22:16: error: ‘itoa’ was not declared in this scope 
int2string.cpp: In function ‘int main()’: 
int2string.cpp:42:2: error: reference to ‘string’ is ambiguous 
int2string.cpp:7:7: error: candidates are: class string 
In file included from /usr/include/c++/4.7/iosfwd:41:0, 
       from /usr/include/c++/4.7/ios:39, 
       from /usr/include/c++/4.7/ostream:40, 
       from /usr/include/c++/4.7/iostream:40, 
       from int2string.cpp:1: 
/usr/include/c++/4.7/bits/stringfwd.h:65:33: error:     typedef class std::basic_string<char> std::string 
int2string.cpp:42:9: error: expected ‘;’ before ‘s1’ 
int2string.cpp:44:2: error: ‘s1’ was not declared in this scope 
int2string.cpp:50:2: error: reference to ‘string’ is ambiguous 
int2string.cpp:7:7: error: candidates are: class string 
In file included from /usr/include/c++/4.7/iosfwd:41:0, 
       from /usr/include/c++/4.7/ios:39, 
       from /usr/include/c++/4.7/ostream:40, 
       from /usr/include/c++/4.7/iostream:40, 
       from int2string.cpp:1: 
/usr/include/c++/4.7/bits/stringfwd.h:65:33: error:     typedef class std::basic_string<char> std::string 
int2string.cpp:50:9: error: expected ‘;’ before ‘s2’ 
int2string.cpp:51:12: error: ‘s2’ was not declared in this scope 
int2string.cpp:54:2: error: reference to ‘string’ is ambiguous 
int2string.cpp:7:7: error: candidates are: class string 
In file included from /usr/include/c++/4.7/iosfwd:41:0, 
       from /usr/include/c++/4.7/ios:39, 
       from /usr/include/c++/4.7/ostream:40, 
       from /usr/include/c++/4.7/iostream:40, 
       from int2string.cpp:1: 
/usr/include/c++/4.7/bits/stringfwd.h:65:33: error:     typedef class std::basic_string<char> std::string 
int2string.cpp:54:9: error: expected ‘;’ before ‘s3’ 
int2string.cpp:55:4: error: ‘s3’ was not declared in this scope 

Я думаю, что я не использую правильное имя файла заголовка и, следовательно, существует неопределенность. Пожалуйста, помогите

+1

Вы действительно пытаетесь повторно определить 'зЬй :: string' класс? –

+0

Есть ли уже встроенный строковый класс? Ошибка указывает на это. Я просто создал строковый объект, создав таким образом класс 'string'. –

+5

Связанный: [Почему «использование пространства имен std;' считается плохой практикой? »(Http://stackoverflow.com/q/1452721/2040040) – johnchen902

ответ

4

Начнет с первой ошибкой, нет itoa стандартной функции, есть, однако в «новом» стандарте C++ 11ы std::to_string функции, которая может быть использована (или вы можете использовать std::strtol, если вы на более старый компилятор без поддержки C++ 11). Конечно, в стандартной библиотеке есть функции для преобразования числовых значений в строки, например std::stoi.

И это приводит меня к другой вещи, если вы хотите изучить C++, вы должны начать использовать, например. std::string для строк. Это поможет вам в будущем. Не изобретайте то, что уже есть в стандартной библиотеке.

Что касается некоторых других проблем, есть некоторые, которые могут быть, потому что вы импортировали все пространство имен std в глобальное пространство имен, что означает, что std::string теперь просто string, который, конечно, сталкивается с именем вашего собственного string класс. Если вы не хотите писать, например. std::cout, то вы можете просто импортировать имена, которые вы хотите, как

using std::cout; 
3

Существует стандартный библиотечный контейнер под названием std::string, определенный в заголовке <string>. Заголовок <iostream> неявно включает его.

Затем вы импортируете полное пространство имен std в глобальную область и определяете свой собственный класс string. Теперь у вас есть два string символы в глобальном масштабе и компилятором по праву жалуясь, что он не знает, какой из них вы имеете в виду, когда вы говорите string s1=123;

Самое лучшее, что нужно сделать, это не использовать using namespace std; вообще. See why.

Тогда itoa не является стандартной функцией.

Остальные ошибки в основном являются следствиями первого.

Смежные вопросы