我使用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() {}
Run Code Online (Sandbox Code Playgroud)
错误消息指出:
c:\ ADandD> g ++ -std = c ++ 14 ComparatorAndSorterTGeneralized.cpp ComparatorAndSorterTGeneralized.cpp:254:80:内部编译器错误:在tsubst中,在cp/pt.c:11738
Run Code Online (Sandbox Code Playgroud)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预览中编译:
#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;
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*ely 10
template <typename T, typename, int, template <typename U, U, U> class>
struct Sort;
Run Code Online (Sandbox Code Playgroud)
这是完全合法的.
它可以像这样重新声明,给所有参数命名:
template <typename T, typename T2, int I, template <typename U, U X, U Y> class TT>
struct Sort;
Run Code Online (Sandbox Code Playgroud)
它声明了一个类模板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; };
Run Code Online (Sandbox Code Playgroud)
将被实例化为:
Foo<int, 1, 2> fi;
Run Code Online (Sandbox Code Playgroud)
要么
Foo<char, 'a', 'b'> fc;
Run Code Online (Sandbox Code Playgroud)