2012-02-21 5 views
5

Al usar la nueva sintaxis del declarador de funciones y decltype, ¿cómo se accede a los miembros? Parece que no es accesible this:C++ Acceda a esto en la Sintaxis del nuevo declarador de funciones

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

Esto produce el error del compilador:

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

Mi compilador es g++ 4.6.2.


Mi solución es declarar un miembro estático llamado self con el mismo tipo que la clase, que tiene dos problemas:

  1. No va a recoger a la CV-calificadores de forma automática, como this haría .
  2. Tengo que mover las declaraciones de miembro anterior el uso decltype o no puede ver el miembro (aunque eso parece más como un error del compilador).

Respuesta

3

Actualizar a GCC 4.7. La versión 4.6 no es compatible con this donde intenta usarlo.

Another question cubre algunas soluciones que puede ser capaz de utilizar.

+1

Me alegro ... esto me estaba haciendo cuestionar mi confianza ya inestable en mi capacidad para leer el documento de estándares. –

+0

@TravisGockel: en general, debe suponer que si su lectura del documento estándar entra en conflicto con GCC (o cualquier compilador en este punto), es más probable que sea el compilador que su comprensión de lectura. –

2

Tiene dos errores. El único error es lo que viste tú mismo. El otro error es que intenta acceder al miembro antes de que se declare. Declare antes de usarlo (observe que el tipo de devolución, incluso si se especifica de manera posterior, no puede acceder a los miembros que declara más tarde, a diferencia del cuerpo de la función).

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

Así que la 2) que plazo como un inconveniente de que su solución no es en realidad un inconveniente porque la verdadera manera de codificar esta todavía necesita el miembro de que se declare antes de usarla.

+0

Muy buen punto. Resulta que descartar 'this->' y simplemente usar 'func' funciona si muevo la declaración de' func' más arriba. –

+0

@Travis no creo que "funcione" de la manera que usted quiere porque el "const" no se respeta de esa manera (antes del cambio en el documento de trabajo que "esto" está permitido y se usa implícitamente aunque no se use explícitamente)) Que "esto" no se haya permitido no tiene nada que ver con la posibilidad de referirse a miembros de datos no estáticos en un "tipo decltype". Por ejemplo, puede decir desde "main": "decltype (context_binder :: func())", si "func" fuera "público" y aceptaría una llamada con cero argumentos. En ese uso, "context_binder :: func" tiene el tipo "Func", no "Func const". –

Cuestiones relacionadas