這是我的代碼來檢查類是否有成員函數begin
與否:模板實例混亂
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};
};
如果我更改了check(cht< Iter (fallBack::*)() const, &C::begin>*);
的cht
秒參數 &checker::begin
,這並不改變語義的代碼因爲的cht
秒模板參數始終checker
由於這種enum {no = (sizeof(check<checker>(0))==sizeof(char))
但代碼變化導致error現在它們是:
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
我想知道這是什麼原因背後的原因。
你的結構非常複雜。它應該做什麼?看起來像一個檢查,如果類T有一個名爲開始 – 2011-12-15 10:23:00
@VJovic成員函數你是對的,我編輯了Q的第一行:) – 2011-12-15 10:28:45