Путаница при инстанцировании шаблонов

Это мой код для проверки наличия у класса функции-члена begin или нет :

template struct has_begin
{
    struct dummy {typedef void const_iterator;};
    typedef typename std::conditional< has_iterator::yes, T, dummy>::type TType;
    typedef typename TType::const_iterator Iter;
    struct fallBack{ Iter begin() const ; Iter end() const;};
    struct checker : T, fallBack {};
    template  struct cht;
    template static char check(cht< Iter (fallBack::*)() const, &C::begin>*); // problem is here
    template static char (&check(...))[2];
public:
    enum {no = (sizeof(check(0))==sizeof(char)),
     yes=!no};
};

Если я изменю второй аргумент cht в check(cht*); на &checker::begin , Это не меняет семантику кода, так как второй аргумент шаблона cht всегда checker из-за этого enum {no = (sizeof(check(0))==sizeof(char))

но изменение кода приводит к error теперь это :

prog.cpp: In instantiation of 'has_begin >':
prog.cpp:31:51:   instantiated from here
prog.cpp:23:38: error: reference to 'has_begin >::checker::begin' is ambiguous

Я хочу знать, в чем причина такого поведения.

7
задан Mr.Anubis 2 January 2012 в 18:51
поделиться