我已经定义了一个类模板和一个函数,
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
,比如:
template <typename F> class Base {
private:
// f is a pointer to function
F* f;
public:
Base(F ff): f(ff) {}
template <typename... Ps> auto operator() (Ps... ps) const -> decltype(f(ps...)) { return f(ps...); }
};
它可以编译。
这两种不同结果的原因是什么?感谢您的时间!