Построение универсального перегруженного оператора << - PullRequest
0 голосов
/ 25 июня 2011

Как мы можем сделать универсальный перегруженный оператор <<?</p>

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

class b{
private:
    int i;
public:
    b(){}
    b(const int& ii):i(ii){}
    friend ostream& operator<<(ostream& o,const t& obj);//Error here
};


class a:public b{
private:
    int i;
    int x;
public:
    a(){}
    a(const int& ii,const int& xx):i(ii),x(xx){}
    friend ostream& operator<<(ostream& o,const t& obj);//Error here
};

template<class t>
ostream& operator<<(ostream& o,const t& obj){
         o<<obj.i;
         return o;
}

int main()
 {
    b b1(9); 
    a a1(8,6);
    cout<<a1<<endl<<b1;
    _getch();
 }

Что здесь можно сделать?

Редактировать: "int i" заменено на приватного члена

Ответ:Функция друга должна быть объявлена ​​таким образом в классе a и классе b:

template<class t>
    friend ostream& operator<< <>(ostream& o,const t& obj);

Ответы [ 3 ]

2 голосов
/ 25 июня 2011

Поместите template<class t> в декларацию friend.

Однако я бы не стал проектировать operator<< - зачем ему нужен доступ для частных пользователей? Лучше добавить геттер для i к a и b и вообще избегать общения.

Редактировать В данном коде объявления friend даже не потребуются, поскольку i равно public в обоих случаях. Я основал свой ответ на предположении, что они должны быть private, потому что иначе дружить здесь не имеет смысла.

1 голос
/ 25 июня 2011

Что такое t? В самом шаблоне он представляет произвольный тип, но это после двух его использований, которые вызывают ошибки.

0 голосов
/ 25 июня 2011

Если у вас есть такая функция, как

template<class t>
ostream& operator<<(ostream& o, const t& value) 

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

Как правило, не рекомендуется определять шаблон для любого t, поскольку вы рискуете сделать его слишком общим. Спросите себя, действительно ли это будет работать для всех t с?

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