2013-11-23 3 views
2

Я получаю ошибку при компиляции простой программы с использованием C++ в linux. Есть 3 файла: Employee.h , Employee.cpp, and Salary.cpp (main). Я включаю несколько заголовков системы в Salary.cpp <iostream>, <fstream>, <string>, <stdio.h>, <stdlib.h> Единственная причина, по которой я использую, - это функция itoa(). Я не мог заставить его компилировать и читать где-нибудь, что «иногда является предварительным условием.
Ошибки я получаю: «Salary.cpp: 195: 47: ошибка: itoa не был объявлен в этой областиКомпиляция простой программы на C++ в linux (первый раз)

Теперь, я я включил заголовки в глобальном масштабе, и itoa() только используется в файле, который я включаю, поэтому я не знаю, почему это произойдет иначе, чем не включать правильные заголовки системы. Нужно ли указывать все системные заголовки в командной строке или что-то еще? Я не совсем уверен, что происходит.

Редактировать: Вот некоторые из исходного кода ... Я только расширил то, что необходимо для его короткого замыкания. Ошибка возникает в функции addEmployee() в нижней части ... Я не уверен, что знаю, как поместить номера строк. Это сразу же после создания нового сотрудника()

#include "Employee.h" 

#include <iostream> 
#include <fstream> 
#include <string> 
#include <cstdio> 
#include <cstdlib> 


void findEmployees(Employee*[], const short); 
void addEmployee(Employee*[], short&); 
unsigned short parseDataFile(Employee* [], short); 
bool insertEmployee(Employee*[], short, Employee*); 

int main(int argc, char** argv) 
{ 
    //100 employees max, too lazy to create dynamic container 
    Employee* employeeList[100]; 

    //Parse data file, return the length of the list made 
    short listLen = parseDataFile(employeeList, 100); 

    //Employee database is built, run query engine 
    std::cout << "*************************************************\n"; 
    std::cout << "This program lets you search for salaries of employees or input new employee information.\n"; 
    std::cout << "*************************************************\n\n\n"; 

    char choice = { 0 }; 
    while (true) 
    { 
     std::cout << "Please choose an option: \n"; 
     std::cout << "(1) Search for employee salaries.\n"; 
     std::cout << "(2) Input new employee data\n"; 
     std::cout << "(3) Exit\n\n"; 
     std::cin >> choice; 

     switch (choice) 
     { 

     case '1': 
      findEmployees(employeeList, listLen - 1); 
      break; 

     case '2': 
      addEmployee(employeeList, listLen); 
      break; 

     case '3': 
      exit(0); 
      break; 
     } 
    } 

    return 0; 
} 

unsigned short parseDataFile(Employee* empList[], short len) 
{ 
    //Do stuff 
} 

void findEmployees(Employee* empList[], const short len) 
{ 
    //Do stuff 
} 

void addEmployee(Employee* empList[], short& len) 
{ 
    char first[32] = ""; 
    char last[32] = ""; 
    char salary[32] = ""; 
    char id[32] = ""; 
    bool loop = true; 

    while (loop) 
    { 
     std::cout << "Input Last Name: "; 
     std::cin.clear(); 
     std::cin.sync(); 
     std::cin.getline(last, 31); 
     std::cout << std::endl << std::endl; 

     std::cout << "Input First Name: "; 
     //Get user name 
     std::cin.clear(); 
     std::cin.sync(); 
     std::cin.getline(first, 31); 
     std::cout << std::endl << std::endl; 

     std::cout << "Input Salary: $"; 
     //Get user name 
     std::cin.clear(); 
     std::cin.sync(); 
     std::cin.getline(salary, 31); 
     std::cout << std::endl << std::endl; 

     Employee* employee = new Employee(); 
     employee->setID(itoa((int)len, id, 10)); //Set id 

     employee->setFirstName(first); //Set first name 
     employee->setLastName(last); //Set last name 
     employee->setSalary(salary); //Set salary 

     //Inserts new employee at the end of the list, no real reason to sort the list for this assignment 
     //I guess I could have used std::vector to make it easy 
     empList[len] = employee; 
     ++len; //Increment length of the list 

     char yesNo = { 0 }; 
     std::cout << "Would you like to enter another employee? (Y, N): "; 
     std::cin >> yesNo; 
     std::cout << std::endl << std::endl; 
     switch (yesNo) 
     { 
      case 'Y': 
      case 'y': 
       //do nothing 
      break; 

      case 'N': 
      case 'n': 
       loop = false; 
      break; 

     }   
    } 
} 
+0

Я думаю (но я не уверен, у меня очень мало опыта C++ ce), что вам нужно включить '' и' ', чтобы эти функции находились в пространстве имен' std'. – Kninnug

+0

Не могли бы вы показать нам некоторые из ваших исходников? Я думаю, он должен работать с заголовками, которые вы используете. – jens108

+0

itoa не является членом std. При включении этих файлов я все равно получаю ту же ошибку. Обновление с источником, 1-2 мин. – user2079828

ответ

3

Linux не обеспечивает реализацию itoa. Лучший способ добиться такой же поведения и работы с C++ 11, использует std::to_string следующим образом:

std::string tmp = std::to_string(1); 

Если вы используете старую версию C++, вы можете использовать строковые потоки:

std::stringstream tmpSS; 
tmpSS << 1; 
std::string tmp = out.str(); 

Edit: в указанном примере, вы должны были бы также назвать std::string «s c_str() метод:

employee->setID((char*) tmp.cstr()); //Set id 

Где tmp это один из предыдущие варианты.

+0

Хорошо, я сейчас пытаюсь это сделать. Edit: О, ну, я думаю, мне придется преобразовать все в std: string, поскольку я использую его с помощью массивов char. – user2079828

+0

@ user2079828 Пожалуйста, проверьте мое последнее обновление, вы можете использовать '' c_str' метод 'std :: string' и направить его в' (char *) '(это важно или вы получите ошибку корректности const, если' setID 'ожидает указатель на char) – jcm

+0

Да, в настоящее время это работает. Не видел обновления. Изменить: nm, я идиот ... member tmpSS не функция durr. Изменить еще раз: это сработало спасибо, и да, это более старая версия, которую я предполагаю. – user2079828

2

Не знаете, в чем проблема (показать часть кода?). itoa является нестандартной функцией в C++.

Если вы хотите преобразовать целое число в строку в C++, и вы можете использовать функцию std::to_string в C++ 11.

3

This function is not defined in ANSI-C and is not part of C++, but is supported by some compilers.

Похоже, что проблема в том, что ваш компилятор не поддерживает функцию itoa.

1
  1. Если мы говорим о itoa(), просто ответьте, что вы не должны использовать эту функцию. Он даже не относится к стандартной библиотеке C. Конечно, это не связано с C++.
  2. Если вы все еще хотите использовать стиль C, используйте соответствующую функцию форматирования, например snprintf() или sprintf().
  3. Если вы действительно хотите C++ и имеете поддержку C++ 11, используйте std::to_string().
  4. Если у вас нет поддержки на C++ 11, но вы хотите быть родным C++, вы можете использовать такие вещи, как str :: ostringstream.

2 подхода в случаях C++ без примера последнего подхода C++ 11

, которые вы могли бы на самом деле обертывают в классе/метод:

int a = 13; 
stringstream ss2; 
ss2 << a; 
string str2 = ss2.str(); 

Альтернатива, что-то вроде (предупреждения, на самом деле это немного грязно, пожалуйста, используйте подход выше, если вы его не нуждаетесь в этом):

int Number = 123; 
string String = static_cast<ostringstream*>(&(ostringstream() << Number))->str(); 
+0

Да, это то, что предоставил jcm. Тем не менее, я благодарю вас за информацию. – user2079828

+0

Ну, наверное, после того, как я уже начал писать. Для меня самая важная старая практика на C++ - последняя (которая, похоже, не предлагается никем здесь), но мне не нравится 'static_cast <>'. Почему это так важно? Похоже, что это только альтернатива std :: to_string(), которая может быть вставлена ​​в выражения. –

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