了解导入在C ++中的工作方式

时间:2019-06-14 12:25:51

标签: c++ namespaces

我正试图了解C++中include的工作原理。我有两个问题。第一个是如何正确导入.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的{​​{1}}。这是为什么? 另外,如果我想包含私有功能-它们应该在#include "HashNode.h"文件中还是在.h文件中?

1 个答案:

答案 0 :(得分:0)

模板类的成员函数本身也是模板。因此,需要使用任何必需的模板参数和模板类型定义来定义它们。

关于第二个问题,它与名称空间有关。如我所见,在同一命名空间下使用名称空间和类可能会引起歧义。虽然,在代码的结构方面,一切似乎都很好。尝试使用#pragma once或某种防护措施来防止此类问题。

相关问题