2012-03-14 18 views
6
struct Messages 
{ 
     template <typename V> 
     static const char* message() {return "test mesage";} 
}; 

template <int Min, class M=Messages> 
struct Test: public M 
{ 
    Test() 
    { 
     M::message<int>(); //error: expected primary-expression before 'int' 
    } 
}; 

int main() 
{ 
    Test<5, Messages> t; 
} 

Sospetto che questo abbia a che fare con una dipendenza reciproca, come il codice di Test dipende dalla classe base M il cui metodo è specializzato all'interno Test. È corretto?Perché non posso chiamare un metodo basato su modello di una classe template derivata da

risposta

7

M::message è un nome dipendente poiché M è un argomento modello. Il compilatore non può sapere che un nome dipendente è di per sé un modello, quindi, è necessario specificare esplicitamente:

M::template message<int>(); 

In caso contrario, il compilatore analizza il codice come se M::message erano un valore, che dà seguito angolo parentesi un significato diverso (cioè vengono analizzati come operatori di dimensioni minori di e maggiori di e non come delimitatori di elenchi di modelli). Il compilatore non può recuperare da un analogo errato.

+0

Grazie, è tutto. Non conoscevo questo uso della parola chiave 'template' per disambiguare i nomi dipendenti. –

Problemi correlati