2009-09-13 12 views
6

Si consideri il seguente codice:Casting puntatore come argomento di un template: Comeau & MSVC compilare, GCC fallisce

template<int* a> 
class base {}; 

int main() 
{ 
    base<(int*)0> test; 
    return 0; 
} 

Sia Comeau e MSVC compilare questo senza problemi (tranne che per Comeau avvertimento circa una variabile non utilizzato), mentre GCC fallisce sulla linea base<(int*)0> test;, affermando

In function `int main()': a casts to a type other than an integral or enumeration type cannot appear in a constant-expression

template argument 1 is invalid

che cosa esattamente si è lamenta? E chi ha ragione - dovrebbe compilare questo codice? Vale la pena notare che la mia versione GCC è estremamente vecchia (3.4.2) che potrebbe avere qualcosa a che fare con esso. Grazie.

+0

proposito: con gcc 4.4.1: test.cpp: 6: errore: un getto di un tipo diverso da un tipo intero o enumerazione non può apparire in una costante espressione test.cpp: 6: errore: template l'argomento 1 non è valido test.cpp: 6: errore: tipo non valido nella dichiarazione prima di ';' token – jdehaan

+0

Grazie a jdehaan, quindi sappiamo che questo non ha nulla a che fare con la mia versione. – GRB

+0

Ur benvenuto. Ho provato a modificare il codice un po 'per renderlo compilabile. Lievi variazioni non hanno chiarito il problema ... – jdehaan

risposta

8

Da un draft standard (il corsivo è mio):

 
14.1.3 A non-type template-parameter shall have one of the following (option- 
    ally cv-qualified) types: 
    ... 
    --pointer to object, accepting an address constant expression desig- 
    nating a named object with external linkage, 
    ... 

A quanto pare, non è legale per creare un'istanza di un modello con un puntatore nullo, come un puntatore nullo non punta a un "oggetto denominato con collegamento esterno" .

+0

Relativo SO: http://stackoverflow.com/questions/275871/how-to-overcome-gcc-restriction-could-not-convert-template-argument-0-to-foo – Managu

+1

+1! Ho provato dando un puntatore a un int come parametro e si è verificato un errore successivo (meglio di quello abbastanza criptico prima) errore: '& a' non è un argomento modello valido di tipo 'int *' perché 'a' non non ha il collegamento esterno – jdehaan

+1

Questo sembra promettente, ma non penso che questo risponda perché GCC e Comeau differiscono. Ad esempio, se cambio in 'base <(int*)1>', * entrambi * Comeau e GCC non riescono a compilare. Inoltre, se questo requisito proviene da una 'bozza', beh, il mio GCC non riesce a compilarlo ma ha 4 anni, quindi se questo fosse aggiunto allo standard durante quel periodo, allora non sarebbe quel requisito che sta facendo strozzatura GCC . – GRB

Problemi correlati