En Visual Studio 2008, el compilador no puede resolver la llamada a SetCustomer
en _tmain
a continuación y que sea inequívoco:acceso ambiguo a la función miembro de plantilla de clase base
template <typename TConsumer>
struct Producer
{
void SetConsumer(TConsumer* consumer) { consumer_ = consumer; }
TConsumer* consumer_;
};
struct AppleConsumer
{
};
struct MeatConsumer
{
};
struct ShillyShallyProducer : public Producer<AppleConsumer>,
public Producer<MeatConsumer>
{
};
int _tmain(int argc, _TCHAR* argv[])
{
ShillyShallyProducer producer;
AppleConsumer consumer;
producer.SetConsumer(&consumer); // <--- Ambiguous call!!
return 0;
}
Este es el error de compilación:
// error C2385: ambiguous access of 'SetConsumer'
// could be the 'SetConsumer' in base 'Producer<AppleConsumer>'
// or could be the 'SetConsumer' in base 'Producer<MeatConsumer>'
Pensé que el mecanismo de búsqueda de argumentos de la plantilla sería lo suficientemente inteligente como para deducir la base correcta Producer
. ¿Por qué no?
que podría conseguir esto, cambiando Producer
a
template <typename TConsumer>
struct Producer
{
template <typename TConsumer2>
void SetConsumer(TConsumer2* consumer) { consumer_ = consumer; }
TConsumer* consumer_;
};
y llame SetConsumer
como
producer.SetConsumer<AppleConsumer>(&consumer); // Unambiguous call!!
pero sería mejor si yo no tuviera que ...
que acababa de señalar que en la solución propuesta, no necesita llamar a 'SetConsumer (& consumer)', 'SetConsumer (& consumer)' será suficiente (y deducirá correctamente el argumento de la plantilla). –
sbk
@sbk: No, no lo hará. Intenté eso antes de publicar, y ahora una vez más para estar seguro. Aún ambiguo. –