【发布时间】:2015-08-18 03:12:34
【问题描述】:
我有一个简单的特征函数:
template <typename Traits>
struct Cal {
typedef typename Traits::T T;
static T f(T a, T b);
};
struct FTraits {
typedef float T;
};
struct DTraits {
typedef double T;
};
我能想到4种方法来实现Cal::f并指定返回类型。
// option 1. compile. as inline implementation
template <typename Traits>
struct Cal {
typedef typename Traits::T T;
static T f(T a, T b) {
return a+b;
}
};
// option 2. compile
template <typename Traits>
typename Traits::T Cal<Traits>::f(T a, T b) {
return a+b;
};
// option 3. does not compile
template <typename Traits>
T Cal<Traits>::f(T a, T b) {
return a+b;
};
// option 4. compile
template <typename Traits>
auto Cal<Traits>::f(T a, T b) -> T {
return a+b;
};
我相信选项 4 是在 c++11 中添加的,因为选项 3 在以前的标准中是不可能的。我的问题是,为什么选项 3 不起作用?具体来说,我想知道返回类型 T 不能命名类型,而参数类型 T 可以命名类型背后的原因。编译器是否针对返回和参数类型在不同的上下文中工作?另外,为什么 c++11 选择选项 4 而不是选项 3?似乎选项 3 比选项 4 更直观。
【问题讨论】:
标签: c++ typetraits