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