Странные ошибки в visual studio

242
02 ноября 2017, 07:10

Уважаемое комьюнити, столкнулся с проблемой в visual studio, которое невероятно раздражает. А именно:

При этом ошибки в 6-ой строке нет.
Содержимое students.h:

#pragma once
#include "student.h"
class students {
private:
    vector <student> list;
public:
    void adding();
    void show();
    void looking_for();
    //void sorting();
    //void writing();
    //void delete_some();
    students();
    ~students();
};

Буду очень признателен за любые мысли на счет этой проблемы.

Содержимое student.h:

#pragma once
#include <iostream>
#include <vector>
#include <conio.h>
#include <string>
#include <fstream>
#include <iomanip>
#include "students.h"
#include "other_func.h"
using namespace std;
class student {
private:
    string name;
    string surname;
    string adress;
    string universety;
    double score;
public:
    void set();
    friend ostream & operator <<(ostream &ost, student obj);
    string return_name();
    string return_surname();
    student();
    student(string oname, string osurname, string oadress, string ouniversity, int oscore);
    ~student();
};

То есть, все, что надо объявить, было объявлено.

Answer 1

Похоже, вы включаете первым в программу student.h.

Тогда вы получаете в тексте сначала объявление класса students, которое начинается как

class students {
private:
    vector <student> list;

но в этот момент компилятору неизвестно, что такое student. Вот он и ругается...

И, кстати, когда он доходит до vector, то он не понимает, о чем речь - потому что

using namespace std;

у вас включено в результате после объявления students...

Интересно, что если вы включите первым students.h, то из-за того, что он сначала включает student.h - то все заработает.

Но вообще-то избегайте таких включений, когда А включает Б, а Б включает А - даже при наличии #pragma once... Как минимум - результат зависит от порядка включения, а это нехорошо...

Answer 2

Классическая ошибка зацикленного включения заголовочных файлов друг в друга: student.h включает students.h, а students.h включает student.h.

Не пытайтесь включать заголовочные файлы друг в друга зацикленным образом - это ничего не дает, а приводит лишь к "необъяснимым" ошибкам.

READ ALSO
Объединение интервалов

Объединение интервалов

Имеется n-промежутков, вида: [a1,b1];[a2,b2];

258
Пирамидальная сортировка на с++

Пирамидальная сортировка на с++

Хочу сделать сортировку пирамидальную (обратную) То есть что бы массив в котором есть числа 4,5,3,0 отсортировало не так 0,3,4,5, а так 5,4,3,0Вот функции...

258
Запуск процесса в памяти в бесконечном цикле

Запуск процесса в памяти в бесконечном цикле

Написать программу, которая бы запускала в памяти еще один процесс и оставляла бы его работать в бесконечном циклеПри повторном запуске...

207
Исключить нажатие кнопок по событию keyup

Исключить нажатие кнопок по событию keyup

Всем приветЕсть такой скрипт

265