我正在创建一个哈希表,我的类HashTable包含以下结构和头文件中的以下函数:
class HashT
{
public:
struct Node
{
std::string key;
std::string value;
Node* next;
};
Node** HashTArray;
void HashTCopy(struct Node** h1, struct Node** h2, unsigned int sz);
HashT(const HashT& hm); (copy constructor that calls HashTCopy)
unsigned int initialBucketCount = 10;
};
在我的源文件中,我将函数定义为并在我的复制构造函数中使用它:
void HashT::HashTCopy(struct Node** h1, Node** h2, unsigned int sz)
{
...
}
HashT::HashT(const HashT& hm)
{
new_HashT = new Node* [hm.initialBucketCount];
HashTCopy(new_HashT, hm.HashTArray, hm.initialBucketCount)
}
当我尝试编译时,我收到错误消息out-of-line definition HashT::HashTCopy..."
和.... note: type of 1st parameter of member declaration does not match definition. 'struct Node**' aka 'HashMap::Node** vs 'struct Node** aka HashMap::Node**'
。编译器指向struct
...' void HashTCopy( struct Node ** h1,....)`。我似乎无法弄清问题。我的声明和定义是匹配的,这里的问题是什么?感谢
答案 0 :(得分:0)
HashT.h:
#ifndef HASHT_H
#define HASHT_H
#include <iostream>
class HashT
{
public:
struct Node
{
std::string key;
std::string value;
Node* next;
};
Node** HashTArray;
void HashTCopy(struct Node** h1, struct Node** h2, unsigned int sz);
HashT(const HashT& hm);
unsigned int initialBucketCount = 10;
};
#endif
HashT.cpp:
#include "HashT.h"
void HashT::HashTCopy(struct Node** h1, Node** h2, unsigned int sz)
{
//...
}
HashT::HashT(const HashT& hm)
{
Node** new_HashT = new Node* [hm.initialBucketCount];
HashTCopy(new_HashT, hm.HashTArray, hm.initialBucketCount);
}
答案 1 :(得分:0)
在实施中,删除struct
之前的Node
,即更改:
void HashT::HashTCopy(struct Node** h1, Node** h2, unsigned int sz)
到
void HashT::HashTCopy(Node** h1, Node** h2, unsigned int sz)
你不需要在C ++中的struct类型的变量之前编写struct
(这是一个C事物,并且那是一个过时的C事物)。你在这里这样做会使编译器混淆名称Node
应该出现在哪个范围内。
Node
结构在HashT
类的命名空间中定义,因此其全名为HashT::Node
。通常,成员函数的参数列表中的类型可以在类的命名空间中隐式解析,而不必在它们前面编写HashT::
。但是这里多余的struct
似乎正在抛弃它,并让它认为你在谈论Node
类之外的一些其他 HashT
结构,它找不到定义,并且与类声明不匹配。
我不确定标准对此有什么说法,所以编译器实际上可能会出错,但我敢打赌删除struct
会解决它。
答案 2 :(得分:0)
进行以下更改:
class HashT
{
public:
struct Node
{
std::string key;
std::string value;
Node* next;
};
Node** HashTArray;
static void HashTCopy(Node** h1, Node** h2, unsigned int sz);
HashT(const HashT& hm); (copy constructor that calls HashTCopy)
unsigned int initialBucketCount = 10;
};
void HashT::HashTCopy(HashT::Node** h1, HashT::Node** h2, unsigned int sz)
{
...
}
HashT::HashT(const HashT& hm)
{
new_HashT = new HashT::Node* [hm.initialBucketCount];
HashT::HashTCopy(new_HashT, hm.HashTArray, hm.initialBucketCount)
}
我认为错误是由于编译器不完全知道从何处获取Node
类中的HashT
结构,因此通过指定其中的命名空间(该类)结构存在,将解决问题
答案 3 :(得分:-1)
我在一个QT项目中遇到了这样的问题,我通过将strut定义移到头文件的顶部来解决了该问题
因此,可以通过将标头文件管理器更新为来尝试类似的操作。
struct Node
{
std::string key;
std::string value;
Node* next;
};
class HashT
{
public:
Node** HashTArray;
void HashTCopy(struct Node** h1, struct Node** h2, unsigned int sz);
HashT(const HashT& hm); (copy constructor that calls HashTCopy)
unsigned int initialBucketCount = 10;
};