以下代码适用于gcc甚至VC11 Nov CTP,但无法使用VC11 RTM进行编译。
template<typename T>
struct A {
typedef typename T::Type BreakMe;
T x;
};
struct B { typedef int Type; };
template<typename T>
struct C {
static A<T> f(A<T> a) {
return A<decltype(a.x)>();
}
static auto g(A<T> a) -> A<decltype(a.x)> {
return A<decltype(a.x)>();
}
};
int main(int argc, char* argv[])
{
C<B>::f(A<B>());
C<B>::g(A<B>());
return 0;
}
VC11 RTM似乎失败了,decltype在返回值中作为模板参数传递:它认为“T = unknown”。请注意f
编译正常,尽管在其中使用了decltype。
这是RTM中的编译器错误吗?如果是这样,有没有办法解决它?
答案 0 :(得分:2)
我找到了解决方法。
诀窍是将整个返回类型传递给辅助结构,并强制在那里解析模板。 typedef
- 帮助器结构中的返回类型似乎不够,因为decltyped模板参数似乎仍然未知。但是,将其设置为帮助程序结构中函数的返回类型似乎会强制解析类型。然后,您可以简单地获取此函数的返回类型(再次使用decltype)。
将此解决方案包含在变通方法宏中
#if defined(_MSC_VER) && _MSC_VER <= 1700
namespace workarounds {
template<typename T>
struct resolve_template {
static T ret();
};
}
#define RESOLVE_TEMPLATE(A) decltype(::workarounds::resolve_template<A>::ret())
#else
#define RESOLVE_TEMPLATE(A) A
#endif
将上述内容添加到上面可以得到:http://rise4fun.com/Vcpp/JplI