Đây là mã của tôi để kiểm tra xem lớp có hàm thành viên begin
hay không:Templates instantiation nhầm lẫn
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};
};
Nếu tôi thay đổi số thứ hai của cht
trong check(cht< Iter (fallBack::*)() const, &C::begin>*);
để &checker::begin
, này không làm thay đổi ngữ nghĩa của mã kể từ khi mẫu đối số thứ hai cht
's luôn là checker
do này enum {no = (sizeof(check<checker>(0))==sizeof(char))
nhưng thay đổi mã kết quả trong error nay đó là:
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ôi muốn biết lý do đằng sau hành vi này là gì.
Cấu trúc của bạn rất phức tạp. Nó phải làm gì? Có vẻ như một kiểm tra nếu lớp T có một hàm thành viên có tên là bắt đầu –
@VJovic Bạn nói đúng, tôi đã chỉnh sửa dòng đầu tiên của câu hỏi :) –
Lỗi nào bạn nhận được nếu bạn thực hiện thay đổi? –