Si consideri l'esempio che ho trovato sul sito di IBM:GCC, Clang e IBM non sono d'accordo su come eseguire la ricerca del nome dipendente dal modello. Quale è giusto?
#include <iostream>
using namespace std;
void f(double) { cout << "Function f(double)" << endl; }
template<class T> void g(T a) {
f(123);
h(a);
}
void f(int) { cout << "Function f(int)" << endl; }
void h(double) { cout << "Function h(double)" << endl; }
void i() {
extern void h(int);
g<int>(234);
}
void h(int) { cout << "Function h(int)" << endl; }
int main(void) {
i();
}
Che cosa ci stampare?
La documentazione IBM mi sono adattato questo esempio da, disponibili here, dice che la stampa:
Function f(double) Function h(double)
La logica di questo è che il nome del modello-parametro dipendente dalla ricerca viene eseguita a destra prima l'istanza di
i()
, quindi trovah(double)
ma nonh(int)
.Quando compilo usando GCC 4.4.1, esso stampa:
Function f(double) Function h(int)
GCC sembra essere alla ricerca i nomi modello-parametri-dipendente nel modello dopo tutto il resto è stato compilato, in modo da trova sia
h(double)
eh(int)
, e preferisce quest'ultimo.Quando compilo usando Clang 2.8, non riesce a compilare. L'errore del compilatore è:
ibm_example.cc:8:3: error: use of undeclared identifier 'h' h(a); ^ ibm_example.cc:16:3: note: in instantiation of function template specialization 'g<int>' requested here g<int>(234); ^ 1 error generated.
Clang sembra essere alla ricerca i nomi modello-parametri-dipendente nel modello nel punto in cui viene dichiarato il modello, in modo da non trova né
h(double)
néh(int)
.
Quale è giusto?
possibile duplicato di [? Quali sono le regole per la scelta di funzioni template sovraccarico] (http://stackoverflow.com/questions/1177739/what-are -le-regole-per-scegliere-da-funzioni-modello-sovraccarico) –
Nessuna modifica per GCC 4.5.1 FWIW. – ergosys
@Foo: Questo non è assolutamente un duplicato di quella domanda, che riguarda la risoluzione di sovraccarico, questa riguarda l'ambito e quali simboli sono visibili al punto di definizione. – ildjarn