Невозможно передать класс шаблона в cout

Когда я пытаюсь скомпилировать следующий (усеченный до небольшого фрагмента ниже) код,

#include <iostream>

using namespace std;

template <typename value_type>
class Tree {
public:
    Tree();
    ~Tree();
};

template <typename value_type>
const std::ostream& operator<<(const std::ostream& o, const Tree<value_type>& t) {
    return o;
}

int main() {
    Tree<int> tree;
    cout << tree << endl;
}

Я получаю следующие ошибки:

лязг на Mac

error: reference to overloaded function could not be resolved;
      did you mean to call it?
        cout << tree << endl;
                        ^~~~

гну gcc в Debian Linux

error: no match for 'operator<<'
(operand types are
    'const ostream {aka const std::basic_ostream<char>}'
    and '<unresolved overloaded function type>')
        cout << tree << endl;
        ~~~~~~~~~~~~~^~~~~~~

Если я никогда не реализую перегрузку оператора, вместо этого gnu g++ выдает следующую ошибку:

error: no match for 'operator<<'
(operand types are
    'std::ostream {aka std::basic_ostream<char>}'
    and 'Tree<int>')
        cout << tree << endl;
        ~~~~~^~~~~~~

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

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
3
0
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Удалите consts на std::ostream - вы не можете использовать постоянный поток ни для чего.

template <typename value_type>
std::ostream& operator<<(std::ostream& o, const Tree<value_type>& t) {
    return o;
}

По какой-то причине я делал это в прошлом, и это работало нормально, но теперь мои компиляторы предпочитают принимать только неконстанты.

user5549921 22.05.2019 16:54

@finnrayment Возможно, вы делали это с другими операторами, но я сомневаюсь, что какой-либо компилятор когда-либо был достаточно сломан, чтобы вы могли сделать это с помощью operator<< и std::ostream. (Обратите внимание, что у вас не возникнет проблем, если вы никогда не используете поток — std::cout << tree; должен работать, пока ваша перегрузка ничего не записывает.)

molbdnilo 22.05.2019 16:56

Ей-богу, клянусь, я сделал это с operator<<std::ostream на днях, и он скомпилировался более чем на трех компьютерах... Тем не менее, вы решили мою проблему, так что большое вам спасибо!

user5549921 22.05.2019 16:58

@finnrayment это «хорошо» для std::cout << x;, но не более того. Сам поток, конечно, не константа, но std::cout << x; приводит к const ссылке, поэтому std::cout << x << whatever; не может работать

463035818_is_not_a_number 22.05.2019 16:59

@formerlyknownas_463035818 А-ха! Вот почему; Я делал один лайнер именно так

user5549921 22.05.2019 17:00

@finnrayment Я регулярно попадаю в эту ловушку, забывая вернуть поток, игнорируя предупреждение, все кажется в порядке, пока я не использую цепочку ...

463035818_is_not_a_number 22.05.2019 17:01

Другие вопросы по теме