2

gcc 4.7.3 を使用すると、次のエラーが表示されます

prog.cpp: 関数 'int main()': prog.cpp:27:63: エラー: 'Erase >::Result' が宣言されていません

このコードで:

template <typename... List>
struct TypeList
{
    enum
    {
        Length = sizeof...(List)
    };
};

template <typename ToErase, typename... List>
struct Erase;

template <typename ToErase>
struct Erase<ToErase, TypeList<>>
{
    typedef TypeList<> Result;
};

template <typename ToErase, typename... Head, typename... Tail>
struct Erase<ToErase, TypeList<Head..., ToErase, Tail...>>
{
    typedef TypeList<Head..., Tail...> Result;
};

int main()
{
    static_assert(Erase<double, TypeList<int, double, char>>::Result::Length == 2, 
    "Did not erase double from TypeList<int, double, char>");

    return 0;
}

同様のケースが正常にコンパイルされることを考えると、受信したエラー メッセージを考慮してコードがコンパイルされない理由がわかりません。

template <typename ToAppend, typename... List>
struct Append;

template <typename ToAppend, typename... List>
struct Append<ToAppend, TypeList<List...>>
{
    typedef TypeList<List..., ToAppend> Result;
}

template <typename... ToAppend, typename... List>
struct Append<TypeList<ToAppend...>, TypeList<List...>>
{
    typedef TypeList<List..., ToAppend...> Result;
}

コードの最初のブロックでやろうとしているように、2 つのパラメーター パックの途中で要素を推測できないという標準からの引用はありますか?

4

1 に答える 1

3

§ 14.8.2.5 (型からのテンプレート引数の推定) パラグラフ 5 には、テンプレート引数を推定できないコンテキストがリストされています。関連するものは、リストの最後のものです。

— parameter-declaration-clause の最後に出現しない関数パラメーター パック。

だから:

struct Erase<ToErase, TypeList<Head..., ToErase, Tail...>>

Head推測できません。パラメーター リストの末尾にはありません。

対照的に、次の場合:

struct Append<TypeList<ToAppend...>, TypeList<List...>>

と の両方がそれぞれのパラメーター リストの末尾に表示されるため、それらを推測することができますToAppendList

于 2013-06-27T05:22:28.803 に答える