どのように私はこのC ++ typelistにテンプレートのコンパイルエラーを修正しますか?
質問
(近代的なCの第3章を読んでから++の設計)
typelist.hppます:
class NullType {};
struct EmptyType {};
template <class T, class U>
struct Typelist
{
typedef T Head;
typedef U Tail;
};
#define TYPELIST_1(T1) Typelist<T1, NullType>
#define TYPELIST_2(T1, T2) Typelist<T1, TYPELIST_1(T2) >
#define TYPELIST_3(T1, T2, T3) Typelist<T1, TYPELIST_2(T2, T3) >
#define TYPELIST_4(T1, T2, T3, T4) Typelist<T1, TYPELIST_3(T2, T3, T4) >
#define TYPELIST_5(T1, T2, T3, T4, T5) Typelist<T1, TYPELIST_4(T2, T3, T4, T5) >
#define TYPELIST_6(T1, T2, T3, T4, T5, T6) Typelist<T1, TYPELIST_5(T2, T3, T4, T5, T6) >
namespace TL
{
template <class TList> struct Length;
template <> struct Length<NullType>
{
enum { value = 0 };
};
template <class T, class U>
struct Length< Typelist<T, U> >
{
enum { value = 1 + Length<U>::value };
};
template <class Head, class Tail>
struct TypeAt<Typelist<Head, Tail>, 0>
{
typedef Head Result;
};
template <class Head, class Tail, unsigned int i>
struct TypeAt<Typelist<Head, Tail>, i>
{
typedef typename TypeAt<Tail, i-1>::Result Result;
};
}
main.cppに
#include "typelist.hpp"
Typelist<int, double> foo;
int main() {
}
G ++ main.cppに
typelist.hpp:37: error: ‘TypeAt’ is not a template
typelist.hpp:43: error: type/value mismatch at argument 2 in template parameter list for ‘template<class Head, class Tail> struct TL::TypeAt’
typelist.hpp:43: error: expected a type, got ‘i’
なぜ私はこのエラーが出るのですか?私はこの問題を解決する方法を教えてください。
解決
あなたは前方宣言が欠落しているように見えます。
これは部分的な特殊化されます:
template <class Head, class Tail>
struct TypeAt<Typelist<Head, Tail>, 0>
しかし、コンパイラは、の専門何わかりません。その前にこれを追加します。
template <class List, unsigned Index>
struct TypeAt;
このletがコンパイラのノウハウだ:「2つのテンプレートパラメータを持つクラスのTypeAt
があります。」だから今、あなたがそれを専門とするとき、コンパイラはあなたが何を言ってるのか知っているクラスます。
注、Typelist
の使用状況が正しくありません。これらのアルゴリズムのは、のセンチネル・終了のです。この手段は、C-文字列のように、彼らはデータが特別な値との間で締結されることを期待します。我々の場合には、これはNullType
です。
だから、取るエリックのアドバイス。 (すなわちヒント:あなたは彼の答えが役に立ったと評価していた場合、アップ票こと)
他のヒント
タイプリストを再帰的に使用されるように設計されています。これは、その第二templaterパラメータは別のタイプリスト、またはNullType(再帰の終了をシグナリング)のいずれかであることが期待
のfooを定義するには、次のように記述する必要があります:
TYPELIST_2(int, double) foo;
あなたがマクロを避けたい場合は、や、
Typelist<int, Typelist<double, NullType> > foo;
所属していません StackOverflow