我有一个简单的特征函数:
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++ 这样复杂的语言的编译器仍然需要从头到尾处理文件。
如果声明在template< … >
之后以 T
开头, 编译器需要知道什么 T
是,以便在继续查找声明的其余部分之前解析它并确定它是一个返回类型。
本质上,限定符 Cal< Traits >::
需要在语法上出现在对 Cal
成员的任何不合格使用之前.使用尾随返回类型扩展语言要容易得多,这会放置 Cal< Traits >::
在 auto
之后立即,而不是创建一种启发式方法来跳过具有未知标识符的类型名称。
关于c++ - 声明模板成员函数返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32062921/