2012-02-15 4 views
9

Eventuali duplicati:
Where and why do I have to put the “template” and “typename” keywords?chiamando la funzione template di classe di base template

Ecco il codice:

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

E, durante l'esecuzione:

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

ottengo i seguenti errori:

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

io sappia non-dependent names and 2-phase look-ups. Ma, quando la funzione stessa è una funzione modello (funzione foo<>() nel mio codice), ho provato a risolvere tutti i problemi solo per fallire.

risposta

19

foo è un nome dipendente, quindi la ricerca prima fase presuppone che si tratta di un variabile a meno che non si utilizzino le parole chiave typename o template per specificare diversamente. In questo caso, si vuole:

this->template foo<int>(); 

Vedi this question se si desidera che tutti i dettagli scabrosi.

+0

grazie! mi ha davvero salvato la pancetta oggi – Jacko

7

si dovrebbe fare in questo modo:

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

Qui è pieno esempio compilabile:

#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(); 
}