gpt4 book ai didi

c++ - 未找到使用表达式模板化的静态 constexpr 成员函数

转载 作者:IT老高 更新时间:2023-10-28 23:01:22 29 4
gpt4 key购买 nike

如下代码

#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

这是正确的(编译器的行为)吗?请注意,如果我通过在指示的行上用 kernel::max_pole 替换它来解析 max_pole,它可以正常编译。

EDIT 向 bugzilla 报告,接受为 bug c++/55992,参见 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55992 . gcc 4.7.x 和 4.8.0 也会发生。

最佳答案

您的模板可以在 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 在这两种情况下都是一个不合格的独立名称,查找策略在这两种情况下应该是相同的,但事实并非如此。对我来说,这就是一个错误。

关于c++ - 未找到使用表达式模板化的静态 constexpr 成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14338887/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com