我真的很想自己解決這個問題,但花幾個小時一次又一次地看同一個代碼並不會讓我開心。該錯誤消息看起來很簡單,它指向Not2
模板。它抱怨說沒有Apply
成員,但顯然有Apply
,其中兩個。 Function2
和Not2
有一個非常相似的形式,但編譯器並沒有說任何關於Function2
,所以Not2
內部有問題。 Not2
意味着採取Function2
模板並取消結果。C++模板替換錯誤
我儘可能地刪除了不相關的代碼,但代碼看起來相當長。如果你認爲閱讀所有不值得花費的時間,請跳過。
main.cpp:130:24: error: type/value mismatch at argument 1 in template parameter list for 'template<class T> constexpr const int unbox<T>'
using Apply = Box<!unbox<T::template Apply<U>::template Apply<V>>>;
^
main.cpp:130:24: note: expected a type, got 'typename T::Apply<U>::Apply<V>'
main.cpp:130:70: error: template argument 1 is invalid
using Apply = Box<!unbox<T::template Apply<U>::template Apply<V>>>;
^
main.cpp: In instantiation of 'struct Sort_<List<Box<2>, Box<1> > >':
main.cpp:155:37: required by substitution of 'template<class T> using Sort = typename Sort_::Type [with T = List<Box<2>, Box<1> >]'
main.cpp:159:38: required from here
main.cpp:151:77: error: no class template named 'Apply' in 'Not2<Function2<LessThan_> >::Apply<Box<2> > {aka struct Not2<Function2<LessThan_> >::Apply_<Box<2> >}'
Filter<Tail<T>, Not2<LessThan>::template Apply<Head<T>>::template Apply>> Type;
^
template<int n>
struct Box
{
};
template<typename T>
struct Unbox_;
template<int n>
struct Unbox_<Box<n>>
{
static constexpr int value = n;
};
template<typename T>
constexpr int unbox = Unbox_<T>::value;
template<typename ...>
struct List
{
};
template<>
struct List<>
{
};
template<typename, typename>
struct Cons_;
template<typename T, typename ...Ts>
struct Cons_<T, List<Ts...>>
{
typedef List<T, Ts...> Type;
};
template<typename T, typename U>
using Cons = typename Cons_<T, U>::Type;
template<typename>
struct Head_;
template<typename T, typename ...Ts>
struct Head_<List<T, Ts...>>
{
typedef T Type;
};
template<typename T>
using Head = typename Head_<T>::Type;
template<typename>
struct Tail_;
template<typename T, typename ...Ts>
struct Tail_<List<T, Ts...>>
{
typedef List<Ts...> Type;
};
template<typename T>
using Tail = typename Tail_<T>::Type;
template<typename T, typename U>
struct Merge_
{
typedef Cons<Head<T>, typename Merge_<Tail<T>, U>::Type> Type;
};
template<typename T>
struct Merge_<List<>, T>
{
typedef T Type;
};
template<typename T, typename U>
using Merge = typename Merge_<T, U>::Type;
template<typename, typename T, typename>
struct If_
{
typedef T Type;
};
template<typename T, typename U>
struct If_<Box<0>, T, U>
{
typedef U Type;
};
template<typename T, typename U, typename V>
using If = typename If_<T, U, V>::Type;
template<typename T, template<typename> class U>
struct Filter_
{
typedef If<U<Head<T>>, Cons<Head<T>, typename Filter_<Tail<T>, U>::Type>,
typename Filter_<Tail<T>, U>::Type> Type;
};
template<template<typename> class T>
struct Filter_<List<>, T>
{
typedef List<> Type;
};
template<typename T, template<typename> class U>
using Filter = typename Filter_<T, U>::Type;
template<template<typename, typename> class T>
struct Function2
{
template<typename U>
struct Apply_
{
template<typename V>
using Apply = T<U, V>;
};
template<typename U>
using Apply = Apply_<U>;
};
template<typename T>
struct Not2
{
template<typename U>
struct Apply_
{
template<typename V>
using Apply = Box<!unbox<T::template Apply<U>::template Apply<V>>>;
};
template<typename U>
using Apply = Apply_<U>;
};
template<typename T, typename U>
struct LessThan_2
{
typedef Box<unbox<T> < unbox<U>> Type;
};
template<typename T, typename U>
using LessThan_ = typename LessThan_2<T, U>::Type;
using LessThan = Function2<LessThan_>;
template<typename T>
struct Sort_
{
typedef Merge<Merge<Filter<Tail<T>, LessThan::Apply<Head<T>>::template Apply>, List<Head<T>>>,
Filter<Tail<T>, Not2<LessThan>::template Apply<Head<T>>::template Apply>> Type;
};
template<typename T>
using Sort = typename Sort_<T>::Type;
int main()
{
typedef Sort<List<Box<2>, Box<1>>> L;
}
爲什麼你有這個複雜的'unbox'結構而不是簡單的'Box :: N',(它需要聲明爲'static constexpr'成員)。 – Walter
可能重複[官方,什麼是typename?](http://stackoverflow.com/questions/1600936/officially-what-is-typename-for) – Walter
@Walter看起來更像lisp。 – xiver77