#include <iostream>
template <class T> class test;
template <class T> test<T> operator + (const test<T>& a, const test<T>& b);
template <class T>
class test
{
T elem;
public:
test () { elem = 0; };
test (const T& a) { elem = a; };
test<T>& operator += (const test<T>& a) { elem += a.elem; return *this; };
friend test<T> operator + <> (const test<T>&, const test<T>&);
friend std::ostream& operator << (std::ostream& os, const test<T>& a)
{ return os << a.elem; };
};
template <class T>
test<T> operator + (const test<T>& a, const test<T>& b) return c(a);
{ c += b; };
int main()
{
test<int> x, y;
x += 5;
std::cout << x << std::endl;
y = x + test<int>(2);
std::cout << y << std::endl;
}