Ambiguous access to base class template member function

Posted by Johann Gerell on Stack Overflow See other posts from Stack Overflow or by Johann Gerell
Published on 2010-04-26T11:51:37Z Indexed on 2010/04/26 11:53 UTC
Read the original article Hit count: 328

Filed under:
|

In Visual Studio 2008, the compiler cannot resolve the call to SetCustomer in _tmain below and make it unambiguous:

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;
}

This is the compilation error:

// error C2385: ambiguous access of 'SetConsumer'
//    could be the 'SetConsumer' in base 'Producer<AppleConsumer>'
//    or could be the 'SetConsumer' in base 'Producer<MeatConsumer>'

I thought the template argument lookup mechanism would be smart enough to deduce the correct base Producer. Why isn't it?

I could get around this by changing Producer to

template <typename TConsumer>
struct Producer
{
    template <typename TConsumer2>
    void SetConsumer(TConsumer2* consumer) { consumer_ = consumer; }

    TConsumer* consumer_;
};

and call SetConsumer as

    producer.SetConsumer<AppleConsumer>(&consumer);   // Unambiguous call!!

but it would be nicer if I didn't have to...

© Stack Overflow or respective owner

Related posts about templates

Related posts about c++