Я новичок в C ++. Я изучаю его с помощью Visual Studio 2019 (c ++ 17), я определил класс в файле .h, но в другом файле .h я не могу его использовать - PullRequest
2 голосов
/ 01 августа 2020

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

Categories_tbl.h

#ifndef CATEGORIES_TBL
#define CATEGORIES_TBL

#include <memory>
#include <vector>
#include <list>
#include "ebb_string.h"
#include "ebb_detial_itme.h"

namespace ebb_impl
{
    class ebb_detial_item;

    namespace
    {
        std::vector<unsigned> default_rev_dates{
            0,    1,    2,    4,    7,
            10,   15,   16,   30,   31,
            90,   91,   150,  151,  152,
            210,  211,  270,  272,  360,
            370,  480,  490,  720,  750,
            1080, 1180, 1440
        };
    }

    class category
    {
    private:
        friend class ebb_detial_item;

        my_ebbstring::ebb_string name{};
        std::list<std::unique_ptr<ebb_impl::ebb_detial_item>> ebbtbl;
        my_utility::id_pool::id_pool<unsigned> item_id_pool;

        std::vector<unsigned>* rev_dates_ptr{ &default_rev_dates };

    public:
        category(my_ebbstring::ebb_string name)
            : name{ name }, item_id_pool{ name } {   }

        category& add(ebb_detial_item* item_ptr);
        category& remove(ebb_detial_item* item_ptr);

        void set_rev_dates(const std::vector<unsigned>& new_plan);
    };
}

#endif

ebb_detial_itme.h

#ifndef EBB_DETIAL_ITEM_H
#define EBB_DETIAL_ITEM_H

#include "ebb_string.h"
#include "my_utility.h"
#include "DateTime.h"
#include "categories_tbl.h"
#include <chrono>
#include <list>

namespace ebb_impl
{
    class ebb_detial_item
    {
    private:
        unsigned item_id{ 0U };
        my_ebbstring::ebb_string content;
        my_ebbstring::ebb_string materials_address;
        my_datetime::DateTime creat_date{};
        unsigned review_times{};
        std::unique_ptr<category> cate_ptr;
 //                     ^~~~~~~~
 //         error1      C2065   'category': undeclared identifier
 //         error2      C2923   'std::unique_ptr': 'category' is not a valid template type argument for parameter '_Ty' 



    public:
        ebb_detial_item(
            my_ebbstring::ebb_string c, 
            category* category_ptr,
 //         ^~~~~~~~
 // error3  C2061   syntax error: identifier 'category' 


            my_datetime::DateTime creat_date,
            my_ebbstring::ebb_string materials_address = ""
        )
            : content{ c }, materials_address{ materials_address }, 
              cate_ptr{ category_ptr}, creat_date{ creat_date }
        {
            item_id = cate_ptr->item_id_pool.next_id();
        }

        bool need_review() const;
        bool need_review(my_datetime::DateTime day) const;

        my_ebbstring::ebb_string get_category() const;
        my_ebbstring::ebb_string get_content() const;
        void set_materials(const my_ebbstring::ebb_string& add);
        void open_materials() const;

        my_ebbstring::ebb_string to_string() const;
    };
}

#endif

Я не могу понять все об этой ошибке. Может быть, пространство имен используется неправильно?

Есть еще некоторые ошибки, которые я не перечислил, все они примерно category. Список ошибок

1 Ответ

1 голос
/ 01 августа 2020

В заголовок Categories_tbl.h вы включаете ebb_detial_itme.h заголовок, а в ebb_detial_itme.h заголовок вы включаете Categories_tbl.h заголовок Это называется "Циркулярное включение"! Вы должны удалить один из них.

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