次のコードを検討してください。
template<typename T>
struct Foo
{
typedef T t_type;
};
template<typename T>
struct Bar
{
typedef T t_type;
};
template<typename U>
auto f() -> typename U::t_type::t_type
{
return typename U::t_type::t_type();
}
int main(int, char**)
{
typedef Foo<Bar<int>> Baz;
f<Baz>();
}
VS2012 ではコンパイルできません:
'U::t_type::{ctor} f(void)' の明示的なテンプレート引数が無効です
t_type
どうやら、コンパイラは、2 番目がtypename U::t_type::t_type
、同じ名前のネストされた型ではなく、コンストラクターに名前を付けていると結論付けているようです。状況を明確にするために私にできることはありますか?