2016-12-25 18 views
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つの異なる結果の理由は何ですか? ありがとうございました!

答えて

1

宣言は、ソースで見られる順にC++で導入されています。要素の機能がクラス宣言内で定義されている場合、その定義は(クラス宣言ではなく)クラス定義の直後に定義されているかのように動作します。 メンバ関数宣言に使用宣言名には適用されない部材定義の位置に関する規則ので

この時点で宣言される必要があります。メンバーの場所を変更すると、必要な宣言が行われます。

+0

クラス内でメンバー関数を宣言して定義する前に、使用するメンバー変数を事前に定義する必要がありますか?または、クラス外でメンバー関数を定義する必要がありますか? –

+0

@Vogel_guo:メンバー関数をどこに定義するかは関係ありません。ただし、*宣言*で参照する名前は、使用するときに知る必要があります(または依存名の関数である必要があります)。これは型名とまったく同じです:後で[メンバ]関数宣言から定義された型を参照することはできません。 –

+0

今私は参照してください。私はメンバー関数の宣言で未定義の名前を使うべきではありませんが、メンバー関数の後に定義されたメンバー変数をその定義に使うことができます。右? –

関連する問題