2015-04-09 2 views
35

Я получаю «Внутренняя ошибка компилятора» с этим с помощью 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; 
} 
+30

«Внутренняя ошибка компилятора "является ошибкой в ​​компиляторе, по определению. Независимо от ответа на ваш вопрос, отправьте отчет об ошибке. – Nemo

+0

Ну. , , um. , , вы отправили отчет об ошибке? – imallett

+5

компилируется в clang ++, внутренняя ошибка компилятора как в gcc4.9, так и в gcc5 – vsoftco

ответ

10
template <typename T, typename, int, template <typename U, U, U> class> 
    struct Sort; 

Это совершенно законно.

Это может быть повторно объявлено как это, давая названия всех параметров:

template <typename T, typename T2, int I, template <typename U, U X, U Y> class TT> 
    struct Sort; 

Он объявляет шаблон класса Sort, который имеет четыре параметра шаблона, параметр типа T, второй тип параметр T2 (безымянный в оригинал), параметр шаблона непигового типа I и шаблонный шаблонный параметр TT.

Шаблон параметр шаблона TT должен шаблон класса принимать три параметра шаблона, U является параметром типа, а второй и третий (X и Y) являются параметры шаблона не-типа типа U.

Подходящий аргумент для четвертого параметра шаблона из Sort может быть что-то вроде:

template <typename T, T t1, T t2> 
    class Foo 
    { static const bool value = t1 < t2; }; 

, который должен быть создан как:

Foo<int, 1, 2> fi; 

или

Foo<char, 'a', 'b'> fc; 
Смежные вопросы