Объясните ошибку: ISO C запрещает объявление `Personlist’ без типа

#c #compiler-errors

#c #ошибки компилятора

Вопрос:

У меня есть класс, который будет обрабатывать массив объектов другого класса, который я создал ранее (который отлично работает). Проблема возникает, когда я пытаюсь создать объект моего класса List.

Это заголовок класса list:

 #ifndef personlistH
#define personlistH
#include "Person.h"
#include <iomanip>
#include <iostream>
#define SIZE 10

namespace std {

    class PersonList {
private:
    Person persons[SIZE];
    int arrnum;
    string filename;

public:
    Personlist();
    };
}
#endif
 

Это основная функция:

 #include <iostream>
#include "PersonList.h"

using namespace std;

int main() {

PersonList personlist;

return 0;   
}
 

Ошибка, которую выдает мне мой компилятор, заключается в следующем:

ошибка: «27 PersonList.h ISO C запрещает объявление `Personlist’ без типа»

Я искал ответы, но, поскольку я новичок в C , это немного сбивало с толку, и я пока не нашел подходящего варианта. Было бы здорово, если бы вы могли объяснить мне эту ошибку.

Ответ №1:

У вас неправильная капитализация в объявлении вашего конструктора. У вас есть Personlist(); , но нужно PersonList(); . Поскольку то, что у вас есть, не равно имени класса, оно считается функцией, а не конструктором, и для функции требуется возвращаемый тип.

Комментарии:

1. И вам также необходимо прекратить размещать свои собственные типы в пространстве имен std, что запрещено.

2. Исправление: существует другая ошибка, извините «.22 PersonList.h `Person’ не называет тип» Я предполагаю, что это может иметь отношение к исходному классу person?

3. Я ожидаю этого. Можете ли вы опубликовать содержимое Person.h? Сначала убедитесь, что Person не находится в пространстве имен, отличном от PersonList, что может вызвать проблему (если только оно не находится в корневом пространстве имен).

Ответ №2:

Не добавляйте свои собственные типы в стандартное пространство имен ( std ), вместо этого создайте свое собственное пространство имен и определите в нем свой класс.

//PersonList.h

 namespace PersonNamespace 
{
    class PersonList 
    {
        //members here
    };
}
 

//Main.cpp

 using namespace PersonNamespace;
 

Фактическая ошибка заключается в том, что вы допустили опечатку Personlist вместо PersonList

Комментарии:

1. Таким образом, вы имеете в виду, что я должен сделать что-то подобное этому: пространство имен x { класс bla bla} …. затем используя пространство имен x; ?

2. Я изменил его на другое пространство имен, как вы показали, но ошибка все еще существует. :/

3. @MikeSeymour: Да, я заметил это чуть позже, первое, что я заметил, это нарушение того, что указано в стандарте в отношении расширяемого std пространства имен.

4. Исправление: существует другая ошибка, извините «.22 PersonList.h `Person’ не называет тип» Я предполагаю, что это может иметь отношение к исходному классу person?

5. @cubsink: обратите внимание, что заглавная L буква в PersonList() вас ошибочно напечатана как маленькая буква l Personlist() , измените это, и это сработает.

Ответ №3:

Ошибка заключается в том, что вы неправильно указали заглавную букву при объявлении конструктора; этого PersonList() не должно быть Personlist() .

Кроме того, вы никогда не должны объявлять свои собственные классы в std пространстве имен; это зарезервировано для стандартной библиотеки. Вы должны создать свое собственное имя пространства имен и поместить в него свои вещи.