鍋あり谷あり

テーマを決めずに適当に書いています。

私の知らないC++ - typename-class-struct

しつこく私の知らない C++
今回は、テンプレート関数を宣言するときに使う、typename 修飾子。という名前のような気がしているものの話:

class hoge{ public:  class c{}; struct s{}; typedef int i; };

template< typename t >
typename t::i tt() // もちろんこれは通る。
{
  typename t::c x;
  typename t::s y;
  return 0;
}

template< typename t >
class t::i cc() // g++ だと OK. cl だとエラー。
{
  class t::c x;
  class t::s y;
  return 0;
}

template< typename t >
struct t::i ss() // g++ だと OK. cl だとエラー。
{
  struct t::c x;
  struct t::s y;
  return 0;
}

void test()
{
  tt<hoge>();
  cc<hoge>();
  ss<hoge>();
}

template 引数の「typename」は「class」と書いてもOKなのはよく知られていると思う。
昔は typename なんてなかったし。
そこに struct と書いてはいけないことはあまり知られていないと思う。
それはさておき、あるシンボルが型であることを明示するために、typename と書かなくちゃいけないというルールがあるが、その typename に struct とか class とか書けるかどうかという話。
これが、マイクロソフトコンパイラと g++ で意見が違う。
どっちが正しいのかは、寡聞にして知らない。
私はいつも typename としか書かないので、この件はどっちでもいいんだが、どっちだかはっきりしているとちょっと便利かもと思わなくもない。