#include <iostream>

template<typename T>
class friended1;

template<typename T>
class test1
{
   friend class friended1<T>;
   void print() const
   {
      std::cout << "test1" << std::endl;
   }
};

template<typename T>
class friended1
{
public:
   template<typename U>
   static void create()
   {
      test1<U>().print();
   }
};

template<typename T>
class friended2;

template<typename T>
class test2
{
   template<typename U>
   friend class friended2;
   void print() const
   {
      std::cout << "test2" << std::endl;
   }
};

template<typename T>
class friended2
{
public:
   template<typename U>
   static void create()
   {
      test2<U>().print();
   }
};

int main()
{
   friended1<int>::create<int>();
   //friended1<int>::create<double>();
   friended2<int>::create<int>();
   friended2<int>::create<double>();
}