Когда я пытаюсь скомпилировать следующий (усеченный до небольшого фрагмента ниже) код,
#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
, как и вы. Есть идеи?
Удалите const
s на std::ostream
- вы не можете использовать постоянный поток ни для чего.
template <typename value_type>
std::ostream& operator<<(std::ostream& o, const Tree<value_type>& t) {
return o;
}
@finnrayment Возможно, вы делали это с другими операторами, но я сомневаюсь, что какой-либо компилятор когда-либо был достаточно сломан, чтобы вы могли сделать это с помощью operator<<
и std::ostream
. (Обратите внимание, что у вас не возникнет проблем, если вы никогда не используете поток — std::cout << tree;
должен работать, пока ваша перегрузка ничего не записывает.)
Ей-богу, клянусь, я сделал это с operator<<
std::ostream
на днях, и он скомпилировался более чем на трех компьютерах... Тем не менее, вы решили мою проблему, так что большое вам спасибо!
@finnrayment это «хорошо» для std::cout << x;
, но не более того. Сам поток, конечно, не константа, но std::cout << x;
приводит к const
ссылке, поэтому std::cout << x << whatever;
не может работать
@formerlyknownas_463035818 А-ха! Вот почему; Я делал один лайнер именно так
@finnrayment Я регулярно попадаю в эту ловушку, забывая вернуть поток, игнорируя предупреждение, все кажется в порядке, пока я не использую цепочку ...
По какой-то причине я делал это в прошлом, и это работало нормально, но теперь мои компиляторы предпочитают принимать только неконстанты.