ある可変テンプレート仮引数パックを、別のテンプレートテンプレート引数で使う時の構文が、構文エラーになってしまうのは何故?

[戻る]
おもち 2017/09/03(日) 18:20:02
可変テンプレート引数の学習中、下のコードを g++6.3( C++14対応。ideone.com )で試したら、「 pack は、テンプレート非型仮引数 として無効です 」という構文エラーになってしまいました。その解決方法の助言を 識者の皆さまに伺いたく、投稿させて頂いた次第です。

template< typename ... Types >                   // 説明によると、この可変テンプレート仮引数パックを、
struct Outer
{
    template< template< Types > class ... pack > // このようにテンプレートテンプレート仮引数に使える。
    struct Inner{
    };
};

int main() {
    Outer< char, int > o;   // こう書くと下の疑似ソースコードのような感じで展開される、との事だが、追試したら構文エラーになってしまった。
                            //
                            // template<
                            //     template< char > class pack_1,
                            //     template< int  > class pack_2
                            // >
                            // struct Inner{
                            // };
}

↑は、https://github.com/EzoeRyou/cpp-book にあるC++11の解説書の 14.4.3 可変引数テンプレート(Variadic Templates) という部分に載っていた物を、追試すべく自分でコードを加えた物です。

実用性はともかく、どこがおかしいのか? を知りたいです。どうぞよろしくお願い致します。

ITO 2017/09/04(月) 10:55:28
C++11でためしましたか?
-stdオプションで変えられるみたいです。
テンプレート関連はかなりバージョンアップにより、変更があるみたいですね。

おもち 2017/09/04(月) 15:07:07
[[解決]]
ideone.com で、コンパイラを C++14( clang )にしただけで、コンパイルできました。
どうやら同じC++14でも、g++ と clang で違うようだ、という事が分かりました。
clangはg++の置換を目指しているとの事で、ほぼ同じだと思い込んでしまっていたようです。

>C++11でためしましたか?
14→11 でなく、上述の通りコンパイラを変えたらOKでした。
が、↑の助言のおかげで、コンパイラを変える発想に至る事ができました。どうも有難うござい
ました。

古いスレッドには追加発言できません。