2012-02-21 9 views
5

Podczas korzystania z nowej składni deklaratora funkcji i decltype, w jaki sposób jeden dostęp członków? Wydaje się, że this nie jest dostępny:C++ Dostęp do tego w nowej funkcji Składnia deklaratora funkcji

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; 
}; 

To daje błąd kompilatora:

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

Moje kompilator jest g++ 4.6.2.


Moje obejście jest zadeklarować członkiem statyczny nazywa self tego samego typu co klasa, która ma dwa problemy:

  1. To nie będzie automatycznie odebrać CV kwalifikatorów, jak this będzie .
  2. Muszę przenieść deklaracje członkowskie powyżej użycie decltype lub nie można go zobaczyć (chociaż wydaje się bardziej jak błąd kompilatora).

Odpowiedz

3

Aktualizacja do GCC 4.7. Wersja 4.6 nie obsługuje this, w której próbujesz go użyć.

Another question obejmuje niektóre obejścia, których możesz użyć.

+1

Cieszę się, że ... to sprawiło, że zadałem sobie pytanie, czy mam już dość niepewności co do mojej zdolności czytania dokumentu standardów. –

+0

@TravisGockel: Generalnie powinieneś założyć, że jeśli czytanie standardowego dokumentu powoduje konflikty z GCC (lub jakimkolwiek kompilatorem w tym momencie), bardziej prawdopodobne jest, że będzie to kompilator niż twoje czytanie ze zrozumieniem. –

2

Masz dwa błędy. Jedynym błędem jest to, co sam zauważyłeś. Innym błędem jest próba uzyskania dostępu do elementu przed jego zadeklarowaniem. Zadeklaruj go przed użyciem (zwróć uwagę, że typ zwracany, nawet jeśli jest określony w sposób kończący, nie może uzyskać dostępu do członków deklarowanych później, w przeciwieństwie do treści funkcji).

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)...); 
    } 
}; 

Więc 2) że termin jako wadę swojego obejścia w rzeczywistości nie jest to wadą, ponieważ prawdziwa droga do kodu to nadal potrzebuje element należy zadeklarować przed użyciem.

+0

Bardzo dobry punkt. Okazuje się, że upuszczenie 'this->' i samo użycie 'func' działa, jeśli przeniesiemy deklarację' func' wyżej. –

+0

@Travis nie sądzę, że "działa" tak, jak chcesz, ponieważ "const" nie jest przestrzegany w ten sposób (przed zmianą w dokumencie roboczym, że "to" jest dozwolone i jest domyślnie używane, nawet jeśli nie jest używane wyraźnie). To, że "to" było niedozwolone, nie ma nic wspólnego ze zdolnością do odwoływania się do niestatycznych elementów danych w "decltype". Na przykład możesz powiedzieć z "main": "decltype (context_binder :: func())", jeśli "func" jest "public" i zaakceptuje wywołanie z zerowymi argumentami. W tym użyciu "context_binder :: func" ma typ "Func", a nie "Func const". –

Powiązane problemy