13

次のコードの場合

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

error: ‘max_pole’ was not declared in this scope

これは正しいですか(コンパイラの動作)?max_pole示された行でそれを置き換えることによって解決するとkernel::max_pole、正常にコンパイルされることに注意してください。

編集bugzillaに報告され、バグc ++ /55992として受け入れられました。http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55992を参照してください。gcc4.7.xおよび4.8.0でも発生します。

4

1 に答える 1

9

テンプレートはClang3.2で正常にコンパイルされます。私はそれがGCCのバグであると強く信じています(GCC 4.7.2にも存在します)。GCC 4.8.0の変更ノートには、そのようなバグ修正については言及されていないようです。

また、の宣言を削除するとコンパイルエラーが消えることにも注意してdo_something<>ください。これは何の違いもありません。

もう1つのヒント:このテンプレートは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>&);
};

このテンプレートコンパイルされます:

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

どちらの場合もmax_pole非修飾の独立した名前であるため、ルックアップ戦略はどちらの場合も同じである必要がありますが、そうではありません。私にとって、これはバグと見なされます。

于 2013-01-15T13:39:53.757 に答える