¿Por qué¿Cómo hacer amistad con el constructor de una clase con plantillas?
class A;
template<typename T> class B
{
private:
A* a;
public:
B();
};
class A : public B<int>
{
private:
friend B<int>::B<int>();
int x;
};
template<typename T>
B<T>::B()
{
a = new A;
a->x = 5;
}
int main() { return 0; }
resultado en
../src/main.cpp:15: error: invalid use of constructor as a template
../src/main.cpp:15: note: use ‘B::B’ instead of ‘B::class B’ to name the constructor in a qualified name
sin embargo, el cambio de friend B<int>::B<int>()
a friend B<int>::B()
resultados en
../src/main.cpp:15: error: no ‘void B::B()’ member function declared in class ‘B’
mientras se quita la plantilla completamente
class A;
class B
{
private:
A* a;
public:
B();
};
class A : public B
{
private:
friend B::B();
int x;
};
B::B()
{
a = new A;
a->x = 5;
}
int main() { return 0; }
compila y ejecuta perfectamente, a pesar de que mi IDE dice que amigo B :: B() es una sintaxis no válida?
Visual C++ 2008 no acepta 'amigo B :: B()' tampoco, pero Comeau sí. –
Visual C++ 2008 acepta 'amigo B :: B ()' aunque, incluso con extensiones de idioma deshabilitadas. ¿Por qué GCC (4.1) no lo aceptará? –
Kyle
En caso de que alguien más no sepa (no lo hice), los constructores _pueden ser declarados amigos: http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#263 –