Я получаю "внутреннюю ошибку компилятора" с помощью GCC 4.9.2:
#include <type_traits>
template <typename T, typename, int, template <typename U, U, U> class>
struct Sort;
template <typename T, template <T...> class Z, T N, T... Is,
template <typename U, U, U> class Comparator>
struct Sort<T, Z<N, Is...>, 0, Comparator> {
template <T I>
struct less_than : std::integral_constant<bool, Comparator<T, I, N>::value> {
};
};
int main() {}
В сообщении об ошибке указано:
c:\ADandD > g++ -std = С++ 14 ComparatorAndSorterTGeneralized.cpp ComparatorAndSorterTGeneralized.cpp: 254: 80: внутренняя ошибка компилятора: в tsubst, при cp/pt.c: 11738
template<T I> struct less_than : std::integral_constant<bool, Comparator<T,I,N>::value> {}; ^
Пожалуйста, отправьте полный отчет об ошибке, с предварительно обработанным источником, если это необходимо. Для получения инструкций см. http://gcc.gnu.org/bugs.html.
Проблема заключается в использовании шаблона <typename U, U, U> class Comparator
. Я никогда не пробовал это раньше. Сначала я попробовал шаблон <typename T, T, T> class Comparator
, но это не скомпилировалось из-за затенения шаблона, поэтому я знал, что это незаконно. И затем смена его на U все еще не скомпилировалась, поэтому я думал, что вся идея не допускается.
Обновление: при создании экземпляра это компилируется в Visual Studio 2015 Preview:
#include <type_traits>
template <typename T, typename, int, template <typename U, U, U> class>
struct Sort;
template <typename T, template <T...> class Z, T N, T... Is,
template <typename U, U, U> class Comparator>
struct Sort<T, Z<N, Is...>, 0, Comparator> {
template <T I>
struct less_than : std::integral_constant<bool, Comparator<T, I, N>::value> {
};
};
template <int...>
struct index_sequence {};
template <typename T, T A, T B>
struct LessThan : std::integral_constant < bool,
A<B> {};
enum { QuickSort, MergeSort, InsertionSort };
int main() {
Sort<int, index_sequence<4, 5, 6, 1, 2, 7>, QuickSort, LessThan> quickSort;
}