Почему я получаю «Нестандартный синтаксис; используйте« & »для создания указателя на член» и «ошибка не перегружена, функция не принимает 2 аргумента»? - PullRequest
1 голос
/ 28 октября 2019

Я получаю эти две ошибки в своем коде:

Error   C3867   'std::basic_string<char,std::char_traits<char>,std::allocator<char>>::c_str': non-standard syntax; use '&' to create a pointer to member 59 
Error   C2661   'Product::Product': no overloaded function takes 2 arguments 59 

Кажется, что когда я пытаюсь вызвать конструктор не по умолчанию, он получает только 2 аргумента, хотя я пытаюсьпередать его 4. Это всего лишь предположение, но я подозреваю, что, возможно, мне нужно добавить некоторые проверки NULL или что-то? но я не вижу, как какой-либо из аргументов, которые я передаю, может иметь значение NULL, поэтому я застрял.

Вот мое объявление и определение для моего конструктора не по умолчанию:

Product(bool restocking, string name, int quantity, double price); //Declaration
Product::Product(bool restocking, string name, int quantity, double price):InventoryItem(restocking), quantity_(quantity), price_(price) { } //Definition

Продукт является производным от InventoryItem

Вот неприятный фрагмент кода:

void InventorySystem::BuildInventory(void) {
   int i{ 0 };
   string name_buffer;
   string quantity_buffer;
   string price_buffer;
   ifstream fin("in_inventory.txt");
   if (fin) {
      while (getline(fin, name_buffer, ';') && i < g_kMaxArray) {
         getline(fin, quantity_buffer, ';');
         getline(fin, price_buffer, '\n');
         p_item_list_[i] =  new Product(false, name_buffer, atoi(quantity_buffer.c_str), atof(price_buffer.c_str)); \\ Error on this line
         i++;
         item_count_++;
      }
   }
   else {
      cout << "Error: Failed to open input file." << endl;
   }
   fin.close();
}

Ответы [ 3 ]

0 голосов
/ 28 октября 2019

Используйте пустые скобки для вызова функции-члена без параметров:

... atoi(quantity_buffer.c_str()) ...

Если компилятор видит c_str без скобок, он делает очень необоснованное предположение, что вы хотите сослаться на саму функцию,используя указатель на него. Это редко используемая функция.

Чтобы еще больше усложнить ситуацию, существует два возможных синтаксиса для указателя на функцию-член, и один из них нестандартный. Это то, на что жалуется компилятор. Вам не нужно ничего из этого, поэтому добавьте скобки, чтобы сообщить компилятору, что вы хотите вызвать функцию, а не брать указатель на нее.

0 голосов
/ 28 октября 2019

Пара () является оператором вызова функции . Без него вы получаете только указатель на функцию , без вызовов

Но зачем использовать atoi, когда этого следует избегать? См. Почему я не должен использовать atoi () . Используйте взамен stoi(). И используйте stod, чтобы получить двойное число вместо stof, которое возвращает число с плавающей запятой

p_item_list_[i] = new Product(false, name_buffer, stoi(quantity_buffer), stod(price_buffer));

Как видите, код чище, и семейство sto* получаетstd::string что даже лучше char*

0 голосов
/ 28 октября 2019

cstr () является функцией, поэтому убедитесь, что вы вызываете ее, чтобы получить результат (а не обрабатывать ее как переменную-член)

         p_item_list_[i] =  new Product(false, name_buffer, atoi(quantity_buffer.c_str()), atof(price_buffer.c_str()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...