Iてきた次のテンプレートクラス&サンプルクラスに応じて設定する方法:、デフォルトのテンプレートパラメータとして、ネストされたテンプレートクラスのインスタンス化は、他のパラメータ
template<typename A, typename B, typename C = typename A::Nested<B>>
struct X
{
X()
{
std::cout << "A is : " << A::who() << std::endl;
std::cout << "B is : " << B::who() << std::endl;
std::cout << "C is : " << C::who() << std::endl;
}
};
struct Bsample
{
static const char* who() { return "Bsample"; }
};
struct Asample
{
template<typename B>
struct Nested;
template<>
struct Nested<Bsample>
{
static const char* who() { return "Asample::Nested<Bsample>"; }
};
static const char* who() { return "Asample"; }
};
vc14を使用して、上記のコードはうまくコンパイルして生成インスタンス化のための予期される振る舞いは、デフォルトテンプレートパラメータC
〜Asample::Nested<Bsample>
のX<Asample, Bsample>
です。 GCC 5.1でコンパイルするとき
はしかし、私は次のエラーを取得する:
prog.cpp:4:65: error: expected '>' before '<' token
template<typename A, typename B, typename C = typename A::Nested<B>>
^
私は、template
、typename
を使用して、テンプレートパラメータC
のデフォルト値を宣言するために、いくつかの組み合わせを試してみました...しかし、しませんでしたこのコードをGCCでコンパイルすることに成功しました。
このコードをC++標準に準拠させ、GCCでコンパイルするにはどうすればいいですか?ヘルプ
EDITため
ありがとう:TartanLlamaから受け入れ答えに加えてTartanLlama
から受け入れ答えのほかには、私はまた、テンプレートパラメータのbraketsを終了する間に空白(スペース)を挿入する必要がありました:
template<typename A, typename B, typename C = typename A::Nested<B> >
// blank (space) added here^
そうでない場合は、GCCは(オプション-std=c++11
が指定されていない)、次のエラーを発行します。
typename
と
template
の両方が必要
error: spurious '>>', use '>' to terminate a template argument list
template<typename A, typename B, typename C = typename A::template Nested<B>>
^
これは単に 'template'と' typename'だけではないので、私は再度投票することにしました。そして、OPは彼らの使い方を認識しているようですが、ここにそれをどのように適用するかはわかりません。 – TartanLlama
@ TartanLlama:悲しいことに、人々は光よりも早く質問を終わらせ、最後まで読んでいない人もいます(私はこれまで人を近づけたアイデアを持っています)。 – shrike