使用表达式找不到模板化的静态constexpr成员函数

时间:2013-01-15 13:31:40

标签: c++ templates c++11 constexpr using-directives

以下代码

#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来解析{{1}},则编译正常。

编辑报告给bugzilla,接受为错误c ++ / 55992,请参阅http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55992。 gcc 4.7.x和4.8.0也会出现。

1 个答案:

答案 0 :(得分: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在两种情况下都 非限定独立名称,因此在两种情况下查找策略应该相同,而事实并非如此。对我来说,这可以将其视为一个错误。