Понимание того, как импорт работает в C ++ - PullRequest
0 голосов
/ 14 июня 2019

Я пытаюсь понять, как в том числе работает в C++.У меня есть два вопроса по этому поводу.Первый - о том, как правильно импортировать файл .h.Например, я создал следующий HashNode.h файл:

namespace HashNode{
    template<class Data>
    class HashNode{
    private:
        Data data;
        HashNode *next;

    public:
        explicit HashNode(const Data &data);

        Data getKey();

        ~Node();
    };
}

Итак, в файле HashNode.cpp он должен выглядеть так:

#include "HashNode.h"

using namespace HashNode;

template <class Data> // ~~~ HERE 1 ~~~
HashNode::HashNode(const Data &data) {//todo};

template <class Data> // ~~~ HERE 2 ~~~
Data* HashNode::getKey() {
    //todo
}

HashNode::~Node() {
    //todo
}

Таким образом, он работает, но должен ли явключать template <class Data> рядом с каждой функцией, которая использует Data?Почему он не распознает Data без включения template <class Data>?

Также я создал файл Hash.h, который должен использовать файл HashNode.h:

#include "HashNode.h"
using namespace HashNode;

namespace Hash {
    template <class Data>
    class Hash {
        typedef enum {
            GOOD = 0,
            BAD = -1,
            BAD_ALLOC = -2
        } Status;

    private:
        HashNode **hash;
        int capacity;
        int size;

    public:
        explicit Hash(int size);

        Status insertData(const Data &data);

        ~Hash();
    };
}

Но я получаюследующая ошибка: Can't resolve type 'HashNode'.Почему он не видит импорт?В файле Hash.cpp я получаю Unused import statement для #include "HashNode.h".Это почему?Кроме того, что, если я хочу включить частные функции - они должны быть в файле .h или в файле .cpp?

1 Ответ

0 голосов
/ 14 июня 2019

Функции-члены шаблонного класса сами являются также шаблонами.По этой причине они должны быть определены с любыми необходимыми параметрами шаблона и определениями типа шаблона.

Что касается вашего второго вопроса, он касается пространств имен.На мой взгляд, наличие пространства имен и класса с одинаковыми именами может привести к неоднозначности.Хотя, кажется, все хорошо в структурной части кода.Попробуйте использовать #pragma once или какую-нибудь охрану, чтобы предотвратить подобные проблемы.

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