To jest mój kod, aby sprawdzić, czy klasa ma funkcję składową begin
czy nie:Szablony instancji zamieszanie
template<typename T> struct has_begin
{
struct dummy {typedef void const_iterator;};
typedef typename std::conditional< has_iterator<T>::yes, T, dummy>::type TType;
typedef typename TType::const_iterator Iter;
struct fallBack{ Iter begin() const ; Iter end() const;};
struct checker : T, fallBack {};
template <typename B, B> struct cht;
template<typename C> static char check(cht< Iter (fallBack::*)() const, &C::begin>*); // problem is here
template<typename C> static char (&check(...))[2];
public:
enum {no = (sizeof(check<checker>(0))==sizeof(char)),
yes=!no};
};
Jeśli zmienię drugi argument cht
w check(cht< Iter (fallBack::*)() const, &C::begin>*);
do &checker::begin
, nie zmienia semantycznego kodu ponieważ drugi szablon argumentem cht
„s jest zawsze checker
powodu tej enum {no = (sizeof(check<checker>(0))==sizeof(char))
ale zmiany kodu powoduje error teraz którymi są:
prog.cpp: In instantiation of 'has_begin<std::vector<int> >':
prog.cpp:31:51: instantiated from here
prog.cpp:23:38: error: reference to 'has_begin<std::vector<int> >::checker::begin' is ambiguous
Chcę wiedzieć, jaka jest przyczyna tego zachowania.
Twoja struktura jest bardzo złożona. Co ma robić? Wygląda jak sprawdzanie, czy klasa T ma funkcję składową o nazwie start –
@VJovic Masz rację, edytowałem pierwszą linię Q :) –
Jaki błąd otrzymasz po wprowadzeniu zmiany? –