Tengo una plantilla de función foo que debe realizar varios cálculos en función de si el parámetro de la plantilla es real o complejo. Incluso si el argumento de la plantilla es std::complexdouble>, el resultado siempre será un número real, como double. Como resultado, mi función es la siguiente:
template <class S>
struct RealType
{
typedef S type;
};
template <class S>
struct RealType<std::complex<S> >
{
typedef S type;
};
template <class S>
class C;
template <class S>
typename RealType<S>::type foo(C<S> &c);
template <class S>
typename RealType<std::complex<S> >::type foo(C<std::complex<S> > &c);
Ahora foo debe ser una función amiga de la clase C, así que hice la siguiente declaración:
template <class S>
class C
{
friend typename RealType<S>::type foo(C<S> &c);
// ...
};
Sin embargo, cuando creo Cstd::complexdouble> >, el compilador se queja de que foo no puede acceder a los miembros secretos de c. Eso funciona perfectamente con Cdouble> si sigues esta documentación. ¿Hay alguna solución (que funcione con C++ 98) para esto? Me doy cuenta de que foo no puede ser miembro de C ya que no permitiría la especialización parcial.
¿Es esto, por cierto, una especialización? Las firmas de ambas versiones de foo parecen idénticas, pero cambian un poco cuando se ingresan los tipos reales.