当前位置: 首页 > 知识库问答 >
问题:

使用std enable_if的嵌套名称说明符中使用的类型不完整

单于旭东
2023-03-14

我有那段代码(这是从一个更大的项目中复制的最小值)。

#include <type_traits>    
template<typename PA, typename E = void>
struct poly_gcd_reduce_helper;

template<typename PA>
struct poly_gcd_reduce_helper<PA, typename std::enable_if<(PA::sign() > 0)>::type>
{
    static constexpr auto val = PA{};
};

template<typename PA>
struct poly_gcd_reduce_helper<PA, typename std::enable_if<(PA::sign() <= 0)>::type>
{
    static constexpr auto val = -PA{};
};

template<typename PA, typename PB>
struct poly_gcd 
{
    static constexpr auto val = poly_gcd<PB, decltype(PA{} -(PA{} / PB{}) * PB {})>::val;
};

template<typename PA>
struct poly_gcd<PA, typename PA::zero_type> 
{
    static constexpr auto val = poly_gcd_reduce_helper<PA>::val;
};

template<int p>
struct myint{
    static constexpr int val = p;
    using zero_type = myint<0>;
    constexpr int sign() const {
        if constexpr (p > 0)
            return 1;
        else if constexpr (p == 0)
            return 0;
        else
            return -1;
    }

    constexpr auto operator-() const {
        return myint<-p>{};
    }
};

template<int a, int b>
static constexpr auto operator/(myint<a> aa, myint<b> bb)
{
    return myint<a / b>{};
}
template<int a, int b>
static constexpr auto operator*(myint<a> aa, myint<b> bb)
{
    return myint<a * b>{};
}
template<int a, int b>
static constexpr auto operator-(myint<a> aa, myint<b> bb)
{
    return myint<a - b>{};
}
template<int a, int b>
static constexpr auto operator+(myint<a> aa, myint<b> bb)
{
    return myint<a + b>{};
}

int main() {
    constexpr auto zou = poly_gcd<myint<2>, myint<4>>::val;
}

它在gcc 9.2中失败,并出现以下错误:

在“constexpr const auto poly_gcd,myint”的实例化中

静态配置的自动val=poly_gcd_reduce_helper::val;

显然,编译器试图实例化poly_gcd_reduce_helper,void

我必须承认我现在不知道该怎么办。

共有2个答案

单于钊
2023-03-14

无需将整数包装为特殊类型,这一切都可以大大简化:

#include <iostream>
#include <type_traits>

using namespace std;

template<int VA, int VB>
struct poly_gcd { 
    static constexpr auto val = poly_gcd<VB, VA-(VA/VB)*VB>::val;
};

template<int VA>
struct poly_gcd<VA, 0> {
    static constexpr int val = (VA < 0) ? -VA : VA;
};

int main() {
    constexpr auto zou = poly_gcd<5,10>::val;
    cout << "zou: " << zou << endl;
}

/test
zou: 2

南宫凡
2023-03-14

poly_gcd_reduce_helper的专门化中,给定用法PA::sign()

换成

static constexpr int sign() {
    if constexpr (p > 0)
        return 1;
    else if constexpr (p == 0)
        return 0;
    else
        return -1;
}

居住

 类似资料:
  • 通读ANSI C Yacc语法规范后,我注意到以下内容都是有效的: 这对我来说似乎很奇怪,因为我对类型的理解表明这些变量都没有类型。这些是什么意思?如何检查它们的类型?分配了多少内存?

  • 问题内容: 我想到的是一个涉及嵌套枚举的数据结构,因此我可以执行以下操作: 如果有方法声明: 然后我可以说(适当): 这是我想出的: 和界面: 我想我只是想用Java来完成这种事情的最佳方法,或者是否需要编写一堆if语句来处理单个Drink.values()。有什么帮助吗? 问题答案: 首先,您提供的示例代码在某种程度上违反了“德米特律”-因为COLUMBIAN实例字段仅用于检索标签。同样,通过这

  • 主要内容:Java11 嵌套类的示例,输出结果为Java 11 引入了嵌套类的概念,我们可以在类中声明一个类。这种类的嵌套允许在一个地方对要使用的类进行逻辑分组,使它们更具可读性和可维护性。嵌套类可以有四种类型 - 静态嵌套类 非静态嵌套类 本地类 匿名类 Java 11 还提供了嵌套的概念,以允许嵌套类的通信和验证。 Java11 嵌套类的示例 ApiTester.java 输出结果为  

  • 我正在使用React和Material ui并创建一个进度条。 我创建了以下类: 然后在我的组件中,我创建了一些来呈现进度条。这就是我想要实现的目标: 这是我的组件: 问题是如何将这些类传递给我的第一个嵌套div:,然后依次传递给下一个嵌套的? 我想我可以使用库,但是我不确定如何使用。 提前谢谢! 编辑:对于寻找此解决方案的任何人,以下是我如何使用条件实现此解决方案:

  • 我发现自己写的代码是这样的: 很多次了。我试图创建一个宏来为我输出此函数: 但无论我为元变量选择什么片段说明符(,,,,它们的组合),它都会出错。有什么魔法咒语能让它起作用? 类型和如下所示: 铁锈操场上的一个(错误)例子。 当然这里有一个XY问题:我使用的是diesel板条箱,它的结构上有派生impl,我希望能够

  • 问题内容: 我在Go中找到了符文类型,并有一个简单的问题,但值得一提。 我发现它是int32的别名,目的是区分数字和字符值。 http://golang.org/pkg/builtin/#rune 但是我对“符文”一词感到困惑,实际上它代表什么?例如uint == unsigned int 问题答案: 但是我对“符文”一词感到困惑,实际上它代表什么?例如uint == unsigned int 符