Esta pregunta está relacionada con mi última one. Estoy tratando de resolver el problema usando traits<T>
y traits<T*>
. Por favor considere el siguiente código.Usar rasgos en C++
template<typename T>
struct traits
{
typedef const T& const_reference;
};
template<typename T>
struct traits<T*>
{
typedef const T const_reference;
};
template<typename T>
class test
{
public:
typedef typename traits<T>::const_reference const_reference;
test() {}
const_reference value() const {
return f;
}
private:
T f;
};
int main()
{
const test<foo*> t;
const foo* f = t.value(); // error here. cannot convert ‘const foo’ to ‘const foo*’ in initialization
return 0;
}
lo que parece que el compilador no está considerando la especialización rasgos para los punteros y tomando tipo de retorno de value()
como const foo
en lugar de const foo*
. ¿Qué estoy haciendo mal aquí?
¡Cualquier ayuda sería genial!
Me siento volcado :(Pero, T en sí es un puntero ('foo *'). Así que especificar 'T *' dará lugar a 'T **'? –
No. En los 'rasgos' especialización, 'T 'no es un puntero,' T * 'es un puntero. Que use el mismo parámetro typename es inconsecuente. –
outis
OK. Gracias. Tiene sentido ahora .. –