我已经定义了一个类模板和一个函数,
_var
报告了标记的错误。但是当我改变了成员变量的顺序时
template <typename F> class Base {
public:
Base(F ff): f(ff) {}
template <typename... Ps> auto operator() (Ps... ps) const -> decltype(f(ps...)) { return f(ps...); }
private:
// f is a pointer to function
F* f;
};
int f(int i, int j)
{
return i + j;
}
int main()
{
using f_type = remove_reference<decltype(f)>::type;
Base<f_type> b{f};
b(2, 5); // [Error] no match for call to '(Base<int(int, int)>) (int, int)'
}
,如:
class Base
它可以编译。
这两种不同结果的原因是什么? 谢谢你的时间!
答案 0 :(得分:1)
声明在C ++中按它们在源代码中看到的顺序引入。事情不同的值得注意的例外是成员函数的主体:当在类声明中定义成员函数时,定义(但不是它的声明)的行为就像在类之后立即定义函数一样定义
由于有关成员定义的位置的规则不适用于成员函数声明中使用的声明名称,因此需要声明在此刻。更改成员的位置提供了必要的声明。