2011-04-27 13 views
6

Todavía estoy tratando de migrar de MSVC a GCC, pero me parece que no puede encontrar una solución al problema siguiente:error extraños GCC: se espera primaria-expresión antes '' símbolo

template < typename A, typename B, typename C, typename D > 
class Test 
{ 
public: 
    Test (B* pObj, C fn, const D& args) : _pObj(pObj), _fn(fn), _args(args) 
    { 
    } 

    A operator()() 
    { 
     return _args.operator() < A, B, C > (_pObj, _fn); // error: expected primary-expression before ',' token 
    } 

    B* _pObj; 
    C _fn; 
    D _args; 
}; 

¡Por favor ayuda!

Respuesta

19

Probar return _args.template operator() < A, B, C > (_pObj, _fn);.

Sin la palabra clave template el análisis sería diferente. Sin ese uso adicional de template, el compilador no sabe que el token (<) que sigue no es realmente "menor que", sino el comienzo de una lista de argumentos de plantilla.

14,2/4

When the name of a member template specialization appears after . or -> in a postfix-expression, or after nested-name-specifier in a qualified-id, and the postfix-expression or qualified-id explicitly depends on a template-parameter (14.6.2), the member template name must be prefixed by the keyword template. Otherwise the name is assumed to name a non-template.

P.S: Lea esta Stackoverflow FAQ Entry

+1

Muchas gracias! Sabía sobre la palabra clave de la plantilla, pero nunca pensé usarla en la declaración de métodos ... Ahora lo entiendo, ¡gracias! – Ryan

+0

Gracias de mí también, había olvidado completamente sobre esto. ¡Esto resolvió un problema similar que tuve! Upvoted. – DNT

Cuestiones relacionadas