Короче ругается вот на это:
template <typename T, typename U>
struct is_same_type {
enum { value = false };
};
template <typename T>
struct is_same_type<T, T> {
enum { value = true };
};
template <typename T, bool check>
struct is_index_type_with_check {
enum { value = false };
};
template <> struct is_index_type_with_check<std::size_t, true> { enum { value = true }; };
#define MAKE_INDEX_TYPE(Type) \
template <> struct is_index_type_with_check<Type, is_same_type<Type, std::size_t>::value> { enum { value = true }; }
MAKE_INDEX_TYPE(int);
MAKE_INDEX_TYPE(unsigned); // вот тут говорит, что уже определено
MAKE_INDEX_TYPE(short);
MAKE_INDEX_TYPE(unsigned short);
MAKE_INDEX_TYPE(long);
MAKE_INDEX_TYPE(unsigned long);
Самое интересное. что если изменить определение is_index_type_with_check на
template <> struct is_index_type_with_check<std::size_t, false> { enum { value = true }; };
то всё работает ( и в студии, и в MinGW...)
Вопрос — почему начинает работать в RAD Studio (бывший Borland Builder)?.
p.s. Это из-за SFINAE в RAD Studio 2010, или это всё-таки карма?