Modelli: la funzione modello non sta giocando bene con la funzione membro modello della class

Questo è un caso di test minimale di qualche codice che effettivamente ho. Non riesce quando tenta di valutare a.getResult() :

 test.cpp: In function 'void printStuff(const A&)': test.cpp:6: error: expected primary-expression before '>' token test.cpp:6: error: expected primary-expression before ')' token 

Il codice è:

 #include  template void printStuff( const A& a) { size_t value = a.getResult(); std::cout << value << std::endl; } struct Firstclass { template size_t getResult() const { X someInstance; return sizeof(someInstance); } }; int main(int, char**) { Firstclass foo; printStuff(foo); printStuff(foo); std::cout << foo.getResult() << std::endl; return 0; } 

Se commento la funzione printStuff e il suo nome, la chiamata foo.getResult() compila bene e fa ciò che ci si aspetta.

Qualche idea su cosa sta succedendo? Ho lavorato con codice estensivamente basato su modelli per un po ‘e non ho mai incontrato nulla di simile.

Quando si fa riferimento a un modello che è un membro di tipo dipendente, è necessario aggiungerlo a un template parola chiave. Ecco come dovrebbe apparire la chiamata a getResult all’interno di printStuff

 size_t value = a.template getResult(); 

Questo è simile all’utilizzo della parola chiave typename quando si fa riferimento a nomi di tipo nidificati in un tipo dipendente. Per qualche ragione, il bit relativo al typename con tipi nidificati è piuttosto noto, ma il requisito simile per template con template nidificati è relativamente sconosciuto.

Si noti che la struttura generale della syntax è leggermente diversa. Il nome del tipo viene sempre messo davanti al nome completo del tipo, mentre il template viene inserito nel mezzo.

Ancora una volta, questo è necessario solo quando si accede a un membro del modello di un tipo dipendente , che nell’esempio precedente sarebbe A in printStuff . Quando chiami foo.getResult<> in main il tipo di foo non dipende, quindi non è necessario includere la parola chiave template .

Il tuo codice è malformato secondo lo standard C ++ 14.2 / 4:

Quando il nome di una specializzazione del modello membro viene visualizzato dopo . o -> in un’espressione postfix , o dopo identificatore nome nested in un id qualificato , e l’espressione postfix o id qualificato dipende esplicitamente da un parametro template (14.6.2), il nome del modello membro deve essere prefisso dal template parole chiave. Altrimenti si suppone che il nome indichi un non-modello.

Quindi, dovresti scrivere size_t value = a.template getResult();