我正试图了解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
文件中?
答案 0 :(得分:0)
模板类的成员函数本身也是模板。因此,需要使用任何必需的模板参数和模板类型定义来定义它们。
关于第二个问题,它与名称空间有关。如我所见,在同一命名空间下使用名称空间和类可能会引起歧义。虽然,在代码的结构方面,一切似乎都很好。尝试使用#pragma once
或某种防护措施来防止此类问题。