2010-12-07 4 views
0

Я пытаюсь создать два перегруженных оператора в шаблоне BSTree.h и встречаюсь с ошибками, которые на самом деле не говорят мне, в чем проблема. Выполнение поиска по кодам ошибок отдельно или в соединении не принесло ничего для меня.Невозможно объявить 2 перегруженного друга << в шаблоне .h

Первый перегружен < < для BSTree не вызывает каких-либо ошибок на компиляции, но второй перегружен < < я создал для моего узла структуры постоянно возвращается следующие ошибки:

ошибка C4430: отсутствует спецификатор типа - int. Примечание: C++ не поддерживает
ошибки C2143 по умолчанию-INT: ошибка синтаксиса: отсутствует «» перед „*“

#ifndef BSTREE_H 
#define BSTREE_H 

#include <iostream> 
#include <fstream> 

template <typename T> 
class BSTree{ 

friend ostream& operator<<(ostream&, const BSTree<T>&); 

public: 
    BSTree(); 
    //BSTree(const BSTree &); 
    ~BSTree(); 

    void buildTree(ifstream&); 
    void setType(char); 
    bool getType(char); 

    bool insert(T*); 

    bool isEmpty(); 


private: 
    char type; 

    struct Node{ 
     T* data; 

     //subnode[0] == left subtree 
     //subnode[1] == right subtree 
     Node* subnode[2]; 
    }; 

    Node* head; 
    void destructorHelper(Node* &); 
    bool insertHelper(T*, Node* &); 
    friend ostream& operator<<(ostream&, const Node*&); 

}; 

Компилятор говорит, что ошибки возникают в строке, где узел перегружен < < код.

template <typename T> 
ostream& operator<<(ostream &output, const BSTree<T> &out) { 
    if(head != NULL) 
     output << head; 
    return output; 
} 

template <typename T> 
ostream& operator<<(ostream &output, const Node* &out) { 
    if(out != NULL){ 
     output << out->subnode[0]; 
     output << *out->data; 
     output << out->subnode[1]; 
    } 

    return output; 
} 

Am Я не позволил объявить 2 перегружен < < в том же .h, даже если они для различных объектов? Или я что-то испортил в своем коде?

ответ

2

error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

Обычно это означает, что компилятор не знает, как идентификатор типа, поэтому он идет в предположении, что это имя параметра, с типом неявно быть int. (В С древности существовало правило, что int в типе параметра можно опустить.) Код, как

void foo(bar); 

может излучать это, если компилятор не знает тип bar и предполагает void foo(int bar).

Это

template <typename T> 
std::ostream& operator<<(std::ostream &output, const typename BSTree<T>::Node* &out) 
{ 
    // ... 
} 

должен составлять. (Обратите внимание на квалификацию std:: и BSTree::.)

+0

Это частично работал, делая только константный BSTree :: Node * возвратила ошибку C4346. Мне пришлось делать const typename :: BSTree :: Node * out, чтобы ошибка исчезла. – Moniker 2010-12-07 19:28:08

0

Возможно, вам это нужно:

константного BSTree :: Node * & из

Node является внутренней структурой.

0

Я подозреваю, что проблема в том, что ostream не в объеме в то время, объявляются ваши operator<<() друг функции.

Либо добавить using std::ostream; только внутри class BSTree{, или указать полное typenames:

friend std::ostream& operator<<(std::ostream&, const BSTree<T>&); 
... 
friend std::ostream& operator<<(std::ostream&, const Node*&); 

В любом случае, фактические определения этих функций необходимо будет изменить аналогичным образом. Независимо от того, что вы делаете, у нет соблазн использовать using std::ostream; или (что еще хуже) using namespace std; в файле заголовка в области файлов, так как это повлияет на каждое последующее объявление в блоке перевода.

1

У вас есть несколько ошибок в коде:

  • вам нужно добавить <> после имен функций вы объявляете, как друг
  • , даже если вы находитесь в теле знакомой функции , вам нужно указать объекты, на которые вы вызываете методы. Помните, что функции не привязаны к экземпляру.
  • в последнем прототипе, узел не доступен за пределами класса она определена. Вы должны точной BSTree :: Node
Смежные вопросы