c – Template参数和它自己的模板参数都包含同名的类型;如何在函数签名中引用第二个?

考虑以下代码:

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下编译:

invalid explicit template argument(s) for ‘U::t_type::{ctor} f(void)’

看起来,编译器得出的结论是,typename U :: t_type :: t_type中的第二个t_type是命名构造函数而不是同名的嵌套类型.我能做些什么来帮助澄清情况吗?

最佳答案 首先,你缺少一个typename关键字

template<typename U>
auto f() -> typename U::t_type::t_type
{
    return typename U::t_type::t_type();
}

和main应该有参数(int,char **).

那说..

这个has already been reported and apparently fixed([将/将]以未指定的“未来版本”发货. MSVC 2013更新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::template t_type
                                ^^^^^^^^
{
    return typename U::t_type::t_type();
}

int main(int, char**)
{
    typedef Foo<Bar<int>> Baz;
    f<Baz>();
}

虽然如果你使用上面的代码,一切都如下图所示:

点赞