10

タイトルが意味をなすかどうかはわかりませんが、例は実際には非常に簡単です。

// A converter struct with a generic constructor.
template <template <typename ...> class TT>
struct converter
{
        template <typename ... Args>    
        converter(const TT<Args ...> &);
};

// A few class templates.
template <typename T>
struct foo {};

template <typename T, typename U>
struct foo2 {};

template <typename ... Args>
struct foo_variadic {};

template <typename Arg0, typename ... Args>
struct foo_variadic2 {};

int main()
{
        // All these compile.
        converter<foo>(foo<int>{});
        converter<foo2>(foo2<int,double>{});
        converter<foo_variadic>(foo_variadic<>{});   
        converter<foo_variadic>(foo_variadic<int>{});
        converter<foo_variadic>(foo_variadic<int,double>{});
        // This will not compile.
        // converter<foo_variadic2>(foo_variadic2<int>{});                     
}

私は GCC 4.8.1 と clang 3.3 で試しました。エラー メッセージは少し異なりますが、すべて5 行目 (およびその後の候補リストからArgsのコンストラクターの除外) で推測する問題を示しています。converter

foo_variadic2は、他の s と比べてどのように特別または異なるfooのですか?

is_instance_of(記録として、テンプレート クラスのインスタンスを検出する型特性を実装しようとしています)

アップデート

これで、セットアップの GCC 4.8.3 と 4.9.1 の両方がこれを受け入れます。clang 3.4.2 はまだ吠えています。

4

1 に答える 1

1

これは解決策ではありませんが、問題が何であるかを理解するのに役立つかもしれません。以下がコンパイルされます。

template <template <typename ...> class TT>
struct converter2
{
    template <typename Arg0, typename ... Args>    
    converter2(const TT<Arg0, Args ...> &);
};

// ...

converter2<foo_variadic2>(foo_variadic2<int>{});

なぜこれが必要なのか、なぜコードが機能しないのか理解できません。

于 2013-09-10T17:12:37.657 に答える