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,被接受为 bug c++/55992,见http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55992。gcc 4.7.x 和 4.8.0 也会出现。

4

1 回答 1

9

您的模板可以使用 Clang 3.2 正常编译。我坚信这是一个 GCC 错误(顺便说一句,它也存在于 GCC 4.7.2 中)。GCC 4.8.0 的更改说明似乎没有提到任何此类错误修复。

另请注意,如果您删除 的声明,编译错误就会消失do_something<>,这不会有任何区别。

还有一个提示:虽然这个模板不能在 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 回答