2013-01-15 17 views
13

Per il seguente codicestatica funzione membro constexpr in templato utilizzando espressione non trovata

#include <array> 

template<unsigned MaxP, typename type> 
struct kernel 
{ 
    static constexpr unsigned max_pole(unsigned P) 
    { return P>MaxP? MaxP:P; } 

    template<unsigned P> 
    using array = std::array<type,max_pole(P)>;   // wrong? 

    template<unsigned P> 
    static void do_something(array<P> const&, array<P>&); 
}; 

gcc 4.7.0 (g ++ -c -std = C++ 11) dà

error: ‘max_pole’ was not declared in this scope 

E` corretto (comportamento del compilatore)? Notare che se risolvo max_pole sostituendolo con kernel::max_pole sulla linea indicata, esso viene compilato correttamente.

EDIT Segnalato a bugzilla, accettato come errore C++/55992, vedere http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55992. Si verifica anche con gcc 4.7.xe 4.8.0.

+0

Appena testato: lo stesso per 'g ++ 4.7.2' Qualcuno ha una versione più recente come 4.8? Forse questo è un bug che è stato risolto ... – leemes

risposta

9

Il tuo modello si compila bene con Clang 3.2. Credo fermamente che sia un bug GCC (che è presente anche in GCC 4.7.2, btw). Le note di modifica per GCC 4.8.0 non sembrano menzionare alcuna correzione di questo tipo.

Si noti inoltre che l'errore di compilazione scompare se si rimuove la dichiarazione di do_something<>, che non dovrebbe fare alcuna differenza.

Un altro suggerimento: mentre questo modello non non compilare il GCC 4.7.2:

template<unsigned MaxP, typename type> 
struct kernel 
{ 
    static constexpr unsigned max_pole(unsigned P) 
    { return P>MaxP? MaxP:P; } 

    template<typename T> 
    using array2 = int[max_pole(3)]; // ERROR! 

    static void do_something(array2<int> const&, array2<int>&); 
}; 

Questo modello fa di compilazione:

template<unsigned MaxP, typename type> 
struct kernel 
{ 
    static constexpr unsigned max_pole(unsigned P) 
    { return P>MaxP? MaxP:P; } 

    // template<typename T> <--- removed 
    using array2 = int[max_pole(3)]; // OK 

    static void do_something(array2 const&, array2&); 
}; 

Dal max_pole è in entrambi i casi an nome indipendente non qualificato, la strategia di ricerca shoul d essere lo stesso in entrambi i casi, e non lo è. Per me, questo lo qualifica come un bug.

+0

Quindi, secondo la tua ricerca, questa situazione si verifica in particolare quando si mescolano due nuove funzionalità di C++ 11 ('constexpr' + alias templates) in determinate circostanze. Lo scenario perfetto quindi per un bug del compilatore. – Gorpik

+0

@Gorpik: sì, ho la stessa sensazione –

+1

+1 grazie. Ho avuto la stessa sensazione. segnalato a bugzilla. – Walter

Problemi correlati