2012-02-15 9 views
9

Duplicar posibles:
Where and why do I have to put the “template” and “typename” keywords?llamando a la función de plantilla de clase base de la plantilla

Aquí está el código:

template<typename T> 
class base 
{ 
public: 
    virtual ~base(); 

    template<typename F> 
    void foo() 
    { 
     std::cout << "base::foo<F>()" << std::endl; 
    } 
}; 

template<typename T> 
class derived : public base<T> 
{ 
public: 
    void bar() 
    { 
     this->foo<int>(); // Compile error 
    } 
}; 

Y, cuando se ejecuta:

derived<bool> d; 
d.bar(); 

que obtienen los siguientes errores:

error: expected primary-expression before ‘int’ 
error: expected ‘;’ before ‘int’ 

Soy consciente de non-dependent names and 2-phase look-ups. Pero, cuando la función en sí es una función de plantilla (función foo<>() en mi código), intenté todas las soluciones provisionales solo para fallar.

Respuesta

19

foo es un nombre dependiente, por lo que la búsqueda de la primera fase supone que se trata de una variable a menos que use las palabras clave typename o template para especificar lo contrario. En este caso, desea:

this->template foo<int>(); 

Ver this question si desea que todos los detalles morbosos.

+0

¡gracias! realmente salvó mi tocino hoy – Jacko

7

las que debe hacerlo de esta manera:

template<typename T> 
class derived : public base<T> 
{ 
public: 
    void bar() 
    { 
     base<T>::template foo<int>(); 
    } 
}; 

Aquí está llena ejemplo compilables:

#include <iostream> 

template<typename T> 
class base 
{ 
public: 
    virtual ~base(){} 

    template<typename F> 
    void foo() 
    { 
     std::cout << "base::foo<F>()" << std::endl; 
    } 
}; 

template<typename T> 
class derived : public base<T> 
{ 
public: 

    void bar() 
    { 
     base<T>::template foo<int>(); // Compile error 
    } 
}; 

int main() 
{ 
    derived<int> a; 
    a.bar(); 
} 
Cuestiones relacionadas