2012-02-21 82 views
5

當使用新函數聲明語法和decltype時,如何訪問一個成員?看來,this不可訪問: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


我的解決方法是,聲明靜態成員叫self與同類型的類,它有兩個問題:

  1. 它不會自動拾取的CV-預選賽,像this會。
  2. 我要移動的成員聲明以上decltype使用或不能看到成員(儘管這似乎更像是一個編譯器錯誤)。

回答

3

升級到GCC 4.7。版本4.6不支持您嘗試使用它的this

Another question涵蓋了您可能能夠使用的一些解決方法。

+1

我很高興......這讓我質疑自己對標準文件閱讀能力的信心。 – 2012-02-21 21:50:49

+0

@TravisGockel:一般來說,你應該假設如果你對標準文檔的閱讀與GCC(或此時的任何編譯器)衝突,那麼它更可能是編譯器而不是你的閱讀理解。 – 2012-02-21 21:58:07

2

您有兩個錯誤。一個錯誤就是你發現自己。另一個錯誤是您嘗試在聲明之前訪問該成員。在使用它之前聲明它(注意返回類型,即使它以尾隨方式指定,不能訪問稍後聲明的成員,與函數體不同)。

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

非常好的一點。如果我將'func'的聲明移到更高的位置,就會放棄'this->'並只使用'func'作品。 – 2012-02-21 22:56:19

+0

@Travis我不認爲它「以你想要的方式工作」,因爲「const」不受這種方式的尊重(在工作論文中允許「this」被允許並且即使沒有明確使用也被隱式使用的變化之前)。該「不允許」與在「decltype」中引用非靜態數據成員的能力無關。例如,如果「func」是「public」並且接受一個帶有零參數的調用,則可以從「main」中說:「decltype(context_binder :: func())」。在該用途中,「context_binder :: func」具有類型「Func」,而不是「Func const」。 – 2012-02-21 23:24:45