Я новичок в программировании. Я продолжаю получать сообщение об ошибке после компиляции моего кода, который содержит определение класса, включенное в файл .h - PullRequest
0 голосов
/ 07 августа 2020

Я пытаюсь вызвать функцию-член настраиваемого класса, но продолжаю получать сообщения об ошибках:

expected primary-expression before First_name 
expected primary-expression before Middle_name 
expected primary-expression before Surname

Это код для main cpp:

#include <iostream >
#include <People.h>
auto NAME = P.Name_Input( std:string First_name, std::string Middle_name, std::string Surname) ;
std::cout<<NAME<<std::endl;

Это файл заголовка:

class Person{
   public:
   std::string Name_Input(std::string First_name, std::string Middle_name, std::string Surname);
} ;

Файл заголовка компилируется хорошо, и он был связан с файлом .cpp для определения метода, и этот раздел также отлично работает. Моя проблема связана с файлом main.cpp.

1 Ответ

2 голосов
/ 07 августа 2020

Ни main.cpp, ни People.h не определяют std::string, поэтому компилятор не знает, что это такое.

Вам нужно добавить #include <string> к People.h:

#ifndef People_H
#define People_H

#include <string> // <-- add this

class Person{
   public:
      std::string Name_Input(std::string First_name, std::string Middle_name, std::string Surname);
};

#endif

Общее практическое правило состоит в том, что любой исходный файл, который должен использовать тип, определенный в другом исходном файле, должен #include этот другой файл (за исключением случаев, когда достаточно использовать предварительные объявления, например, при разрыве круговых ссылок). См. . Хорошая практика - полагаться на транзитивное включение заголовков? . Это означает, что main.cpp также должен иметь оператор #include <string>, даже если People.h (или любой другой заголовок main.cpp использует) уже имеет свой собственный #include <string> оператор.

Кроме того, ваше использование из std::string в main() неверно. Не включайте имя типа при передаче переменной в метод функции или класса. Используйте имя типа только в объявлении переменной или параметра функции.

Попробуйте вместо этого:

#include <iostream>
#include <string> // <-- add this
#include "People.h"

int main()
{
    Person P;
    std::string First_name;
    std::string Middle_name;
    std::string Surname;

    ...

    auto NAME = P.Name_Input(First_name, Middle_name, Surname);
    std::cout << NAME << std::endl;

    ...

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...