2013-01-15 10 views
13

Für den folgenden Code gefundenstatische constexpr Memberfunktion in Templat unter Verwendung des Ausdrucks nicht

#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) gibt

error: ‘max_pole’ was not declared in this scope 

dies ist richtig (Verhalten des Compilers)? Beachten Sie, dass, wenn ich max_pole auflösen, indem Sie es durch kernel::max_pole in der angegebenen Zeile ersetzen, kompiliert es gut.

BEARBEITEN Berichtet zu Bugzilla, akzeptiert als Fehler C++/55992, siehe http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55992. Tritt auch mit gcc 4.7.x und 4.8.0 auf.

+0

Nur getestet: gleich für 'g ++ 4.7.2' Jemand hat eine neuere Version wie 4.8? Vielleicht ist dies ein Fehler, der behoben wurde ... – leemes

Antwort

9

Ihre Vorlage kompiliert gut mit Clang 3.2. Ich glaube fest daran, dass es sich um einen GCC-Bug handelt (der auch in GCC 4.7.2 zu finden ist, btw). Änderungen in GCC 4.8.0 scheinen keinen solchen Bugfix zu erwähnen.

Beachten Sie auch, dass der Kompilierungsfehler verschwindet, wenn Sie die Deklaration do_something<> entfernen, die keinen Unterschied machen sollte.

Ein weiterer Hinweis: während diese Vorlage tut nicht 4.7.2 auf GCC kompilieren:

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

Diese Vorlage tut Kompilierung:

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

Seit max_pole ist in beiden Fällen ein unqualifizierten unabhängigen Namen, die Lookup-Strategie Shoul In beiden Fällen ist es dasselbe, und das ist es nicht. Für mich ist dies ein Fehler.

+0

Also, nach Ihren Recherchen passiert diese Situation speziell, wenn Sie unter bestimmten Umständen zwei neue C++ 11-Funktionen ("conexpr" + Alias-Vorlagen) mischen. Das perfekte Szenario für einen Compilerfehler. – Gorpik

+0

@Gorpik: ja, ich habe das gleiche Gefühl –

+1

+1 danke. Ich hatte das gleiche Gefühl. bei Bugzilla gemeldet. – Walter