Q:

No Suitable User Defined Conversion error con uso de templates

Estoy realizando un programa en C++ que sobrecargue los operadores. Por ejemplo para el operador * querría que se pudiese multiplicar:
Cuadrado a(2.1);
Circulo b(1.3);
Circulo b(4.3);
Triangulo x= a * b * c

He creado el operado Cuadrado*Circulo pero a la hora de asignar el resultado a la variable x que es de tipo triángulo me indica lo siguiente:
No Suitable User Defined Conversión from Cuadrado to Triangulo.

¿Cómo puedo hacer un conversor de tipos de cuadrado a Triangulo?
template < int DIM1, int DIM2>
class Forma
{
    double value;
    public:

    int a;
    int b;

    Forma(double in) : value(in) {
        a = DIM1, b = DIM2;
    }

    //Getters
    const double get_data() const { return value; }

    //Setters
    const void set_data(double d)  {value=d; }
};

//Multiplication
template<class Cuadrado, class Circulo>
Circulo operator*(Cuadrado left, Circulo right)
{
Circulo result (left.get_data() * right.get_data());
return result;
}

using Cuadrado = Forma < 1, 1 >; 
using Triangulo = Forma < 1, 2 > ;
using Circulo = Forma < 1, 3 > ;

Estos tipos son creado a partir del template de la clase Forma.

A:

El error no se está produciendo en la multiplicación sino en la asignación:
Triangulo x = a * b * c:
//          ^

Y el motivo es el siguiente:
template<class Cuadrado, class Circulo>
Circulo operator*(Cuadrado left, Circulo right)

El operador de multiplicación devuelve un objeto del mismo tipo que el segundo argumento, luego en la multiplicación tenemos:
Triangulo = Cuadrado * Circulo * Circulo
Triangulo = Circulo * Circulo
Triangulo = Circulo

Te falta sobrecargar el constructor copia... pero claro, no es un constructor copia al uso porque no es lo mismo Triangulo que Circulo`:
template < int DIM1, int DIM2>
class Forma
{
public:

  template<int DIM3, int DIM4>
  Forma( Forma<DIM3,DIM4> const& otro)
    : Forma{otro.get_data()}
  { }
};

Llamar a los constructores así de forma anidada (constructores delegados)solo es posible a partir de C++11
Por otro lado, fíjate que todos los miembros y operadores de Forma son privados... luego dificilmente vas a conseguir que el código compile. Entiendo que tu diseño debería parecerse más bien a este:
template < int DIM1, int DIM2>
class Forma
{
    double value;
    public:

    int a;
    int b;

public:

    Forma(double in) : value(in) {
        a = DIM1, b = DIM2;
    }
    //Getters
    const double get_data() const { return value; }

    //Setters
    const void set_data(double d)  {value=d; }

  template<int DIM3, int DIM4>
  Forma( Forma<DIM3,DIM4> const& otro)
    : Forma(otro.get_data())
  { }

  template<int DIM3, int DIM4>
  Forma const& operator=(Forma<DIM3,DIM4> const& otro)
  {
    set_data(otro.get_data());
    return *this;
  }
};

Me he tomado la molestia de incluir también el operador de asignación.

