Это мой код для проверки наличия у класса функции-члена 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
но изменение кода приводит к 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
Я хочу знать, в чем причина такого поведения.