2013-01-15 4 views
13

W następnym kodemstatycznych funkcji element constexpr w matrycy za pomocą ekspresji nie znaleziono

#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 ++ -std -C = C++ 11) daje

error: ‘max_pole’ was not declared in this scope 

Jest to poprawne (zachowanie kompilatora)? Zauważ, że jeśli rozwiążę max_pole przez zastąpienie go kernel::max_pole we wskazanej linii, kompiluje się dobrze.

EDIT Zgłoszone do bugzilli, zaakceptowane jako błąd C++/55992, patrz http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55992. Występuje również z gcc 4.7.xi 4.8.0.

+0

Po prostu przetestowane: to samo dla 'g ++ 4.7.2' Ktoś ma nowszą wersję jak 4.8? Być może jest to błąd, który został naprawiony ... – leemes

Odpowiedz

9

Twój szablon kompiluje się dobrze z Clang 3.2. Mocno wierzę, że jest to błąd GCC (który jest również obecny w GCC 4.7.2, btw). Zmiany w GCC 4.8.0 nie wspominają o takich poprawkach.

Zauważ, że błąd kompilacji zniknie, jeśli usuniesz deklarację do_something<>, która nie powinna mieć żadnego znaczenia.

Jeszcze jedna wskazówka: podczas gdy ten szablon robi nie skompilować na 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>&); 
}; 

Ten szablon robi kompilacji:

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&); 
}; 

Od max_pole jest w obu przypadkach an Niekwalifikowana nazwa niezależna, strategia wyszukiwania shoul w obu przypadkach być taki sam, a tak nie jest. Dla mnie to kwalifikuje to jako błąd.

+0

Tak więc, zgodnie z twoimi badaniami, sytuacja ta dzieje się szczególnie, gdy miksujesz dwie nowe funkcje C++ 11 ('constexpr' + alias templates) w pewnych okolicznościach. Idealny scenariusz dla błędu kompilatora. – Gorpik

+0

@Gorpik: tak, mam to samo uczucie –

+1

+1 dzięki. Miałem to samo uczucie. zgłaszane w bugzilla. – Walter

Powiązane problemy