#ifdef __cplusplus
#include <iostream>
#endif
class input_iterator_tag {};
class forward_iterator_tag : public input_iterator_tag {};
class bidirectional_iterator_tag : public forward_iterator_tag {};
class random_access_iterator_tag : public bidirectional_iterator_tag {};
template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &it, _Tp &value, const forward_iterator_tag* tag){
printf("2\r\n");
return set_value(it, value, (input_iterator_tag*)NULL);
};
template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &it, _Tp &value, const bidirectional_iterator_tag* tag){
printf("3\r\n");
return set_value(it, value, (forward_iterator_tag*)NULL);
};
template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &it, _Tp &value, const random_access_iterator_tag* tag){
printf("4\r\n");
return set_value(it, value, (bidirectional_iterator_tag*)NULL);
};
template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &val, _Tp &value, const input_iterator_tag* tag){
printf("1\r\n");
return val;
};
template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &it, _Tp &value){
return set_value(it, value, it.tag); //Error: 'set_value' - ambiguous call to overloaded function
};
template<typename T>
struct A{
T data;
static random_access_iterator_tag* tag;
};
template<typename T>
random_access_iterator_tag* A<T>::tag = NULL;
class B{};
void OnStart (){
A<B*> it;
const B* const b_ptr = new B();
set_value(it, b_ptr); //Compile Error
A<int> it_int;
const int value_int = 5;
set_value(it, value_int);
}
int main(){
OnStart();
return 0;
};