Я получаю «Внутренняя ошибка компилятора» с этим с помощью 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=c++14 ComparatorAndSorterTGeneralized.cpp ComparatorAndSorterTGeneralized.cpp:254:80: internal compiler error: in tsubst, at cp/pt.c:11738
template<T I> struct less_than : std::integral_constant<bool, Comparator<T,I,N>::value> {}; ^
Please submit a full bug report, with preprocessed source if appropriate. See http://gcc.gnu.org/bugs.html for instructions.
вопрос является шаблоном <typename U, U, U> class Comparator
используется. Я никогда не пробовал это раньше. Сначала я попробовал шаблон <typename T, T, T> class Comparator
, но это не скомпилировалось из-за затенения шаблона, поэтому я знал, что это незаконно. И затем смена его на U все еще не скомпилировалась, поэтому я думал, что вся идея не допускается.
Update: По инстанцировании, это компилируется в 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;
}
«Внутренняя ошибка компилятора "является ошибкой в компиляторе, по определению. Независимо от ответа на ваш вопрос, отправьте отчет об ошибке. – Nemo
Ну. , , um. , , вы отправили отчет об ошибке? – imallett
компилируется в clang ++, внутренняя ошибка компилятора как в gcc4.9, так и в gcc5 – vsoftco