2009-09-13 15 views
6

Rozważmy następujący kod:Casting wskaźnik jako szablonu argumentu: Comeau & MSVC skompilować, GCC nie

template<int* a> 
class base {}; 

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

Zarówno Comeau i MSVC skompilować to bez problemów (z wyjątkiem Comeau ostrzeżenie o nieużywanej zmiennej), natomiast nie GCC na linii base<(int*)0> test;, podając

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

Na co dokładnie narzeka? A kto ma rację - czy ten kod się skompiluje? Warto zauważyć, że moja wersja GCC to wyjątkowo stara (3.4.2), więc może mieć z tym coś wspólnego. Dzięki.

+0

FYI: z gcc 4.4.1: test.cpp: 6: error: odlew do innego typu niż integralna lub wyliczenia typu nie może pojawić się w stałej ekspresji test.cpp: 6: error: template argument 1 jest nieprawidłowy test.cpp: 6: błąd: nieprawidłowy typ w deklaracji przed ';' token – jdehaan

+0

Dzięki jdehaan, więc wiemy, że nie ma to nic wspólnego z moją wersją. – GRB

+0

Witamy w Ur. Próbowałem trochę zmodyfikować kod, aby go skompilować. Niewielkie różnice nie wyjaśniają problemu ... – jdehaan

Odpowiedz

8

Z draft standard (podkreślenie dodane):

 
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, 
    ... 

Najwyraźniej nie jest to legalne instancji szablonu z pustym wskaźnikiem, jak null pointer nie wskazują na „nazwie obiektu z zewnętrznym łącznikiem” .

+0

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

+1

+1! Próbowałem przez podanie wskaźnika do int jako parametru i pojawił się następujący błąd (lepszy niż dość tajemniczy wcześniej) błąd: '& a' nie jest poprawnym argumentem szablonu typu 'int *' ponieważ 'a' ma nie ma powiązania zewnętrznego – jdehaan

+1

To wydaje się obiecujące, ale nie sądzę, aby to odpowiadało, dlaczego GCC i Comeau różnią się. Na przykład, jeśli zmienię na 'base <(int*)1>', * zarówno * Comeau, jak i GCC nie skompilują się. Dodatkowo, jeśli to wymaganie pochodzi z "projektu", to mój GCC nie potrafi go skompilować, ale ma 4 lata, więc jeśli byłby dodany do standardu w tym czasie, to nie byłoby to wymaganie, które powodowałoby dławienie GCC. . – GRB

Powiązane problemy