4

次のコードを検討してください。

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、同じ名前のネストされた型ではなく、コンストラクターに名前を付けていると結論付けているようです。状況を明確にするために私にできることはありますか?

4

2 に答える 2