1
でメンバ変数の順序Iは、標識されたエラーが報告されたクラステンプレート
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)'
}
、クラステンプレートと機能を定義しました。それはコンパイルでき
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...); }
};
:ようしかし、ときに私は、 class Base
のメンバ変数の順序を変更しました。
これらの2つの異なる結果の理由は何ですか? ありがとうございました!
クラス内でメンバー関数を宣言して定義する前に、使用するメンバー変数を事前に定義する必要がありますか?または、クラス外でメンバー関数を定義する必要がありますか? –
@Vogel_guo:メンバー関数をどこに定義するかは関係ありません。ただし、*宣言*で参照する名前は、使用するときに知る必要があります(または依存名の関数である必要があります)。これは型名とまったく同じです:後で[メンバ]関数宣言から定義された型を参照することはできません。 –
今私は参照してください。私はメンバー関数の宣言で未定義の名前を使うべきではありませんが、メンバー関数の後に定義されたメンバー変数をその定義に使うことができます。右? –