2012-02-21 7 views
5

新しい関数宣言子の構文とdecltypeを使用する場合、どのように一つのアクセスのメンバーがいますか?C++のアクセス、この中の新機能宣言子構文

template <typename Func> 
struct context_binder 
{ 
public: 
    context_binder(const Func& func) : 
      func(func) 
    { } 

    template <typename... TArgs> 
    auto operator()(TArgs&&... args) const 
      -> decltype(this->func(std::forward<TArgs>(args)...)) 
    { 
     return func(std::forward<TArgs>(args)...); 
    } 
private: 
    Func func; 
}; 

これはコンパイラエラーを生成:

scratch.cpp:34:25: error: invalid use of ‘this’ at top level 

私のコンパイラがg++ 4.6.2あるthisにアクセスできないことが表示されます。


私の問題を回避するには、静的メンバは、2つの問題があるクラスと同じタイプ、とselfと呼ば宣言することです:

  1. thisが希望のようにそれは、自動的にCV-修飾子をピックアップしません。 。
  2. 会員宣言decltypeの使用以上に移動する必要があります。メンバーが表示されない場合もあります(これはコンパイラのバグのようですが)。 GCC 4.7から

答えて

3

アップグレード。バージョン4.6では、使用しようとしているthisがサポートされていません。

Another questionは、使用することができるかもしれないいくつかの回避策をカバーしています。

+1

私は...これは私が標準文書を読むために私の能力の私すでに不安定な自信を問う作っていたうれしいです。 –

+0

@TravisGockel:一般的には、標準の文書の読者がGCC(またはこの時点でコンパイラ)と矛盾していると、読者の読解よりもコンパイラである可能性が高いと想定してください。 –

2

あなたは、2個のエラーがあります。 1つの誤りはあなたが目撃したものです。もう1つのエラーは、メンバーが宣言される前にそのメンバーにアクセスしようとしていることです。あなたはそれを使用する前にそれを宣言(関数本体とは異なり、あなたが後で宣言のメンバーにアクセスすることはできません、それは末尾の方法で指定されている場合でも、戻り値の型ことに注意してください)。

template <typename Func> 
struct context_binder 
{ 
private: 
    Func func; 

public: 
    context_binder(const Func& func) : 
      func(func) 
    { } 

    template <typename... TArgs> 
    auto operator()(TArgs&&... args) const 
      -> decltype(this->func(std::forward<TArgs>(args)...)) 
    { 
     return func(std::forward<TArgs>(args)...); 
    } 
}; 

これをコーディングするための現実的な方法はまだあなたがそれを使用する前に宣言するメンバーを必要とするためですから、あなたの回避策の欠点としての用語2)は実際には欠点ではありません。

+0

非常に良い点。 'this->'を削除し、 'func'の宣言をより上位に移動すると' func'だけが動作します。 –

+0

@Travis "const"はそのようには尊重されていないので( "これ"が許可され、明示的に使用されていなくても暗黙的に使用されている)。 「これ」が許されなかったことは、「宣言型」内の非静的データメンバーを参照する能力とは何の関係もありません。例えば、 "main"から言うことができます: "func"が "public"であれば "decltype(context_binder :: func())"、引数がゼロの呼び出しを受け入れます。このような用途では、 "context_binder :: func"は "Func const"ではなく "Func"型を持ちます。 –