考虑以下代码:
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>();
}
虽然如果你使用上面的代码,一切都如下图所示: