2014-11-22 2 views
0

Я делаю хэш-таблицу, и мой класс HashTable состоит из следующей структуры и следующая функция в моем файле заголовка:C++ вне строки определения

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 Узел ** h1, ....) `. Я не могу понять проблему. Моя декларация и определение совпадают, так что в этом проблема? Благодаря

+2

Показать ** все ** ваш код, [потому что это отлично работает для меня] (http://ideone.com/MRwYvB) – Cornstalks

+0

сделаю. Добавлен в конструктор копирования, который вызывает эту функцию. – Steven

+0

Почему вы не определяете реализацию для использования 'HashT :: Node' (вместо' struct Node')? – Cornstalks

ответ

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); 
} 
+0

проблема все еще существует: /. Идк, почему существует два разных типа. Один из них - Node **, а другой - HashT :: Node ** – Steven

+0

Вам нужно объявить new_HashT как «Node **» – osdreams

+0

Мне нужен new_HashT, чтобы быть массивом указателей, указывающих на узлы. – Steven

0

В реализации, удалите struct перед Node, т.е. изменение:

void HashT::HashTCopy(struct Node** h1, Node** h2, unsigned int sz) 

к

void HashT::HashTCopy(Node** h1, Node** h2, unsigned int sz) 

Вам не нужно писать struct до того переменных типа структуры в C++ (это вещь C и устаревшая вещь C). Вы делаете так, здесь путает компилятор о том, что сфера имя Node должен появиться.

Node структура определяется в пространстве имен HashT класса, поэтому его полное имя HashT::Node. Обычно типы в списке аргументов функции-члена могут быть неявно разрешены внутри пространства имен класса, без необходимости писать HashT:: перед ними. Но избыточное struct здесь, похоже, выбрасывает его и заставляет думать, что вы говорите о каком-то другомNode struct вне класса HashT, который не может найти определение, и которое не соответствует объявление класса.

Я не уверен, что стандарт говорит об этом, поэтому компилятор действительно может быть ошибкой здесь, но я бы сказал, что удаление struct исправит его.

+0

Я удалил 'struct' из моего объявления и моей подписи функции, и это дало мне ошибку, говоря« неизвестное имя типа »Node ' – Steven

Смежные вопросы