2016-06-25 2 views
1

Я пытаюсь реализовать двоичное дерево поиска. Код не является полным, но я все равно его построил, чтобы узнать, какие возможные ошибки я получу. Вот код для этого:Ошибка: ожидаемый конструктор, деструктор или преобразование типа перед токеном '*' |

BST.h
class BST { 

    public: 
    struct node 
    { 
     //All nodes must be able to point to left and right 
     int key; //All nodes can hold a key value 
     node* left; //All nodes have a left pointer 
     node* right;//All nodes have a right pointer 
    }; 

    node* root; //References the very top of the tree 

    public: 
     BST(); //Constructor that initializes each time instance is called 
     node* CreateLeaf(int key); 

}; 
BST.cpp
#include<iostream> 
#include<cstdlib> 

#include "BST.h" 
using namespace std; 

BST::BST() 
{ 
    root = NULL; 
} 

node* BST::CreateLeaf(int key) //Causing errors 
{ 
    node* n = new node; 
    n->key = key; 
    n->left = NULL; 
    n->right = NULL; 
    return n; 
} 
main.cpp
#include <iostream> 
#include <cstdlib> 

#include "BST.cpp" 


using namespace std; 

int main() 
{ 

return 0; 
} 

Это дает ошибку: Ошибка: ожидаемый конструктор, деструктор или преобразование типа перед токеном '*'

В файле BST.cpp, если объявить функцию CreateLeaf(), как:

typedef node* BST::CreateLeaf(int key) 

изменения ошибки в: Ошибка: ожидается инициализатор до '*' лексем

Теперь, с общим смысл, так как я заявляю функцию CreateLeaf вне класса, я делаю это:

BST::node* BST::CreateLeaf(int key) 

Теперь ошибка становится: ошибки: В функции BST: множественное определение `BST :: BS T()»

Я использую CodeBlocks IDE на Windows, 10.

EDIT: я удалил файл .cpp и возвестили все функции внутри заголовка файла (и включен файл заголовка в главной функции). Теперь он компилируется. Но было бы здорово, если бы кто-нибудь мог сообщить мне, почему ошибка произошла в первую очередь.

+0

Какое местоположение ошибки? – melpomene

+1

Вы не включаете файлы .cpp; это не то, как он должен работать. – melpomene

+0

https://www.youtube.com/watch?v=3FPjmO3-6IY&list=PLTxllHdfUq4d-DE16EDkpeb8Z68DU7Z_Q&index=5 Я использую это видео в качестве ссылки. Это работает для него, почему не для меня? –

ответ

2

В декларации

node* BST::CreateLeaf(int key) 

& hellip; имя node не известно компилятору, поскольку оно определено в классе BST, и оно здесь используется вне этого класса.

Одно простого исправления использовать новый обратный скользящий тип синтаксис:

auto BST::CreateLeaf(int key) 
    -> node* 

Здесь компилятор знает, что декларация принадлежит к классу BST, в точке, где она встречает node.

В качестве альтернативы вы можете квалифицировать имя,

BST::node* BST::CreateLeaf(int key) 

& hellip; но это может стать уродливым, особенно с кодом шаблона.


В других новостях,

#include "BST.cpp" 

& hellip; в файле main.cpp - непродуманная практика. Одна из практических причин заключается в том, что в проекте IDE это может привести к тому, что код будет скомпилирован дважды: одна компиляция BST.cpp и одна компиляция того же кода, что и в main.cpp.

Вместо этого просто скомпилируйте BST.cpp отдельно.

Или создайте его в качестве файлового модуля заголовка (в основном это включает в себя объявление функций как inline).

+0

Использование auto создает другую ошибку. Он говорит, что ожидает инициализатор перед токеном '*'. –

+0

Я удалил файл BST.cpp. Я объявил все функции класса внутри класса в файле BST.h. Теперь он успешно компилируется ... –

+0

Обязательно отметьте все реализации функций, которые вы перемещаете в заголовочный файл, как 'inline' (в противном случае вы можете получить ошибку компоновщика, когда заголовок используется в двух или более единицах перевода). Что касается «auto генерирует другую ошибку», я не смог бы воспроизвести это. Возможно опечатка. –

0

Вне объявления класса вы должны предварить простор node:

BST::node* BST::CreateLeaf(int key) { 
// ^^^^^ ... 
    } 

Кроме того, вы не должны включать в себя .cpp файлы. Включите заголовок, скомпилируйте и соедините файлы .cpp отдельно.

+0

Проверьте мои последние несколько строк вопроса. При этом возникает ошибка: ошибка: множественное определение 'BST :: BST() '| –

+0

Это, безусловно, одно (неловкое) решение, но для этого не нужно «** need **». –

+0

@SaunvedMutalik Вы по-прежнему не сообщают нам об ошибке. – melpomene

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

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