fork download
  1. #include <iostream>
  2.  
  3. // Forward declarations
  4. template <typename T> class C;
  5. template <typename T> std::ostream& operator<<(std::ostream& os, const C<T>& dt);
  6.  
  7. template <typename T>
  8. class C
  9. {
  10. public:
  11. explicit C(T data) : data_(data) {}
  12. template <typename T2>
  13. friend std::ostream& operator<<(std::ostream& os, const C<T2>& dt);
  14. private:
  15. T data_;
  16. };
  17.  
  18. template <typename T>
  19. std::ostream& operator<<(std::ostream& os, const C<T>& dt)
  20. {
  21. C<char> c('!'); // Also has access even when T != char
  22. return os << dt.data_ << c.data_;
  23. }
  24.  
  25. int main()
  26. {
  27. C<int> der(234);
  28. std::cout << der;
  29. }
  30.  
Success #stdin #stdout 0s 3412KB
stdin
Standard input is empty
stdout
234!