Невозможно объявить 2 друга перегруженными << в шаблоне .h - PullRequest
0 голосов
/ 07 декабря 2010

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

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

ошибка C4430: отсутствует указатель типа - предполагается int. Примечание: C ++ не поддерживает default-int
ошибка C2143: синтаксическая ошибка: отсутствует ',' до '*'

#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*&); 

};

Компилятор сообщает, что ошибки происходят в строке, где находится перегруженный << код Node. </p>

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

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

Ответы [ 4 ]

2 голосов
/ 07 декабря 2010

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::.)

1 голос
/ 07 декабря 2010

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

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

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

Либо добавьте using std::ostream; только внутрь class BSTree{, либо укажите полностьюуточненные имена:

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

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

0 голосов
/ 07 декабря 2010

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

const BSTree :: Node * & out

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...