VS2012-在尾部返回类型中将类型声明为模板参数
VS2012 - Decltype as template parameter in trailing return type
以下代码适用于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:http://rise4fun.com/Vcpp/9u2
- VC11 CTP:http://rise4fun.com/Vcpp/6lS
VC11RTM似乎失败了——decltype作为模板参数在返回值中传递:它认为"T=unknown"。注意,尽管f
内部使用了decltype,但它编译得很好
这是RTM中的编译器错误吗?如果是这样,有没有办法解决这个问题?
我找到了一个解决方法。
诀窍是将整个返回类型传递到辅助结构中,并强制在那里解析模板。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
相关文章:
- 在C++中声明一个函数时,它需要有函数本身的参数吗
- 对可变参数使用声明.如何选择正确的功能
- Arduino C++在构造函数中用参数声明对象数组
- 标准::向量声明中使用的模板参数
- 当简单捕获中的标识符显示为参数的声明符 ID 时,没有编译器诊断
- 将类型声明为类型模板参数的模板参数的一部分是否合法?
- 构造函数/函数声明参数列表中的统一初始化
- C++ - 声明指向返回任何类型并获取任意数量参数的函数的指针
- 带参数的数据结构的全局声明
- C++使用默认模板参数键入别名和转发声明
- 警告:忽略模板参数上的属性..在 std::unique_ptr (-wignore 属性)的声明中
- C++声明模板参数阴影模板参数错误
- "extern"声明以及带有和不带参数列表的类模板实例的后续定义
- 如何使用参数声明实例?
- 采用nulltpr_t的构造函数:函数定义不声明参数
- c++ 函数定义不声明参数
- 在循环范围之外声明参数是否更有效?
- 在linux下使用mingw交叉编译器声明"参数"中的两种或多种数据类型
- Clang Format多行函数声明参数问题
- 氧-声明参数为可选的