2010-10-04 17 views

Respuesta

2

name<T> y name<U> son vistas por el compilador como dos clases diferentes, y no le permite acceder a miembros privados de la otra clase. ¿Como arreglarlo? O rediseña o otorga amistad. O proporcione acceso ... Hay muchas maneras de hacerlo, la más adecuada depende de su intención. Si adivino correctamente tu intención, es una buena idea conceder amistad, pero no puedo ver la imagen completa del código que publicaste.

1

Deberá agregar setters/getters (o amistad, o alguna otra cosa). El problema es que name<T> y name<U> son clases completamente independientes.

Alternativamente, ¿por qué no agrega otro constructor name(const T &h) : h_(h) {}?

7

name<int> y name<double> son ejemplos diferentes, y por lo tanto son en realidad diferentes clases. Sus miembros privados no pueden ser compartidos por defecto. Necesita hacer name<T> amigo a todos los demás name 's.

template <typename T> 

class name 
{ 
public: 
    name() : h_(0){} 

    template <typename U> 
    operator name<U>() 
    { 
     name<U> u; 
     u.h_ = h_; 
     return u; 
    } 
private: 
    int h_; 
    template <typename> // <-- 
    friend class name; // <-- 
}; 

int main(void) 
{ 
    name<int> a; 
    name<double> b = a; 
    return 0; 
} 
0

name<T> puede ser diferente de name<U> [por ejemplo: en su caso]. Por lo tanto, no se puede acceder a los miembros privados de la otra [en caso de que T y U sean tipos diferentes].

Agregue lo siguiente a su definición de clase.

template<typename U> 
friend class name; 
0

Name<T> es potencialmente un tipo diferente a Name<U>, por lo que se aplican las reglas de encapsulación. Usa accesos o amigos.

3

name<int> intenta acceder a un miembro privado de name<double>. Debería poder solucionarlo haciendo que la función de conversión sea amiga, pero los compiladores probé go havoc if you try.

También podría hacer cualquier name<T> un amigo de name<U> para solucionar esto.

template <typename T> 
class name 
{ 
public: 
    name() : h_(0){} 

    template <typename U> 
    operator name<U>() 
    { 
     name<U> u; 
     u.h_ = h_; 
     return u; 
    } 

    template<typename U> 
    friend class name; // <---- 

private: 
    int h_; 
}; 
+0

¿Qué 'plantilla plantilla nombre de un amigo Nombre :: operador ();', que debería funcionar (no he probado todavía), ¿verdad? –

+2

@Prasoon sí que * debería * funcionar. Ver el enlace PR contra clang. Pero la redacción de la Norma para las declaraciones de amigos en las plantillas es, en mi opinión, muy lenta :) Por lo tanto, puedo ver por qué comeau se cuelga, se cuelga también para un ejemplo ligeramente modificado y GCC se niega a aceptarlo :) –

Cuestiones relacionadas