оператор << перегрузка для вызова проблемы с функцией печати - PullRequest
0 голосов
/ 23 февраля 2012

Хорошо, я немного застрял при попытке перегрузить оператор << для моего класса шаблона.Требование заключается в том, что оператор << должен вызвать функцию печати void, определенную для этого класса. </p>

Вот важные вещи из заголовка шаблона:

template <class T>
class MyTemp {
public:
    MyTemp();           //constructor

    friend std::ostream& operator<< (std::ostream& os, const MyTemp<T>& a);

    void print(std::ostream& os, char ofc = ' ') const;

, а вот моя функция печатив основном это вектор, который печатает последний элемент первым:

    template <class T>
void Stack<T>::print(std::ostream& os, char ofc = ' ') const
{
    for ( int i = (fixstack.size()-1); i >= 0 ; --i)
    {
        os << fixstack[i] << ofc;
    }
}

и вот как у меня есть оператор << перегружен: </p>

    template <class T>
std::ostream& operator<< (std::ostream& os, const Stack<T>& a)
{
    // So here I need to call the a.print() function
}

Но я получаю "неразрешенный внешний символ"" ошибка.Так что на самом деле у меня есть две проблемы.Во-первых, это способ исправить ошибку выше.Во-вторых, как только это будет исправлено, я просто вызову a.print (os) внутри << overload?Я знаю, что это должно вернуть ostream, хотя.Любая помощь будет принята с благодарностью! </p>

Ответы [ 3 ]

2 голосов
/ 23 февраля 2012

Самое простое, что нужно сделать, это оставить print общедоступным (как в вашем примере), чтобы оператору не нужно было дружить.

template <class T>
class MyTemp {
public:
    void print(std::ostream& os, char ofc = ' ') const;
};

template <class T>
std::ostream& operator<< (std::ostream& os, const MyTemp<T>& a) {
    a.print(os);
    return os;
}

Если вам нужно, чтобы он был закрытым, тогда вам нужно объявить правильную специализацию шаблона как друга - ваше объявление friend объявляет не шаблонный оператор в окружающем пространстве имен, а не шаблон. К сожалению, чтобы сделать шаблон друга, вам необходимо объявить его заранее:

// Declare the templates first
template <class T> class MyTemp;
template <class T> std::ostream& operator<< (std::ostream&, const MyTemp<T>&);

template <class T>
class MyTemp {
public:
    friend std::ostream& operator<< <>(std::ostream& os, const MyTemp<T>& a);
    // With a template thingy here  ^^

private:
    void print(std::ostream& os, char ofc = ' ') const;
};

template <class T>
std::ostream& operator<< (std::ostream& os, const MyTemp<T>& a) {
    a.print(os);
    return os;
}

Или вы можете определить оператор inline:

template <class T>
class MyTemp {
public:
    friend std::ostream& operator<<(std::ostream& os, const MyTemp<T>& a) {
        a.print(os);
        return os;
    }

private:
    void print(std::ostream& os, char ofc = ' ') const;
};

Ваш последний вопрос:

Во-вторых, как только это будет исправлено, я просто вызову a.print(os) внутри << перегрузки? Я знаю, что для этого нужно вернуть ostream.

Он действительно должен возвращать ostream - просто верните тот, который был передан, как в моем примере кода.

1 голос
/ 23 февраля 2012

Эта ошибка означает, что существует символ, который не может быть распознан компоновщиком. На какой переменной вы получаете эту ошибку а также, пожалуйста, проверьте стек, потому что есть класс std :: stack.

0 голосов
/ 23 февраля 2012

Поскольку ваша функция-член print является общедоступной, нет необходимости объявлять operator<< как friend.

Остерегайтесь того, что вы используете класс Stack, это ваша перегрузка и MyTemp выше ...

...