функция друга в определении шаблона - PullRequest
2 голосов
/ 16 января 2010

Мой вопрос немного связан с this one.

Я хочу перегрузить оператор << для некоторого класса, и я нашел две разные записи, которые работают обе: </p>

template <class T>
class A{
  T t;
public:
  A(T init) : t(init){}
  friend ostream& operator<< <> (ostream &os, const A<T> &a); //need forward declaration
  //template <class U> friend ostream& operator<< (ostream &os, const A<U> &a);
};

Я определяю одинаковые вещи с разными обозначениями? Или первая версия более ограничительна, в которой экземпляр (в данном случае только экземпляр с тем же T, что и мой класс A) << является другом A?

Ответы [ 2 ]

1 голос
/ 16 января 2010

Первая версия ограничивает дружбу operator<< для определенного типа A<T>, а вторая делает любой operator<<, который принимает A<SomeType> друга.

Так что да, первый более строгий:

template<class T>
ostream& operator<< (ostream& os, const A<T>& a) {
    A<double> b(0.0);
    b.t; // compile error with version 1, fine with version 2
    return os;
}

int main() {
    A<int> a(0);
    cout << a << endl;
}
0 голосов
/ 16 января 2010

Так получилось, что определение функций-друзей имеет исключение для шаблонов.Это позволяет вам написать это:

template <class T>
class A{
  T t;
public:
  A(T init) : t(init){}
  friend ostream& operator<<(ostream &os, const A &a)
  {  // Implementation in the class
  }
};

И у него есть то преимущество, что оно создает обычную функцию, автоматически создаваемую для каждого создаваемого вами экземпляра A<T>.

http://www.parashift.com/c++-faq-lite/templates.html#faq-35.16

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