C ++外联定义

时间:2014-11-22 03:02:30

标签: c++ struct declaration member definition

我正在创建一个哈希表,我的类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,....)`。我似乎无法弄清问题。我的声明和定义是匹配的,这里的问题是什么?感谢

4 个答案:

答案 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;
 };