当前位置:  开发笔记 > 编程语言 > 正文

编译器错误模板参数列表<比较

如何解决《编译器错误模板参数列表<比较》经验,为你挑选了0个好方法。

我在样式中有一个模板函数:

template  DERIVED_TYPE pow(TYPE const x);

此函数在模板结构中作为友元函数内联定义:

template 
struct unit {
    typedef unit type;

    ....
    template 
    friend constexpr unit_pow_t pow(type const x) { ... }
};

这是因为将具有单位的值与功率一起取决于该值必须改变单位.

当我尝试使用它省略Exponent时,我可以看到编译器考虑匹配的候选者:

src/model/Tool.cpp:113:3: error: no matching function for call to 'pow'
                pow(1._m);
                ^~~
src/model/../units/Units.hpp:2266:46: note: candidate template ignored: couldn't infer template argument 'Exponent'
        friend constexpr unit_pow_t pow(type const x) {
                                                    ^
/usr/include/math.h:255:8: note: candidate function not viable: requires 2 arguments, but 1 was provided
double  pow(double, double);
        ^

到目前为止事情是预期的,模板可以看到,但当然需要指定Exponent.当我做的时候会发生意外的事情:

src/model/Tool.cpp:113:6: error: comparison between pointer and integer ('double (*)(double, double)' and 'int')
                pow<3>(1._m);
                ~~~^~

编译器将pow视为" double pow(double,double) " 的地址,并将<3解释为将函数指针与整数进行比较的意图.clang 3.4,3.6和GCC 5.2会出现问题.

我的问题是,我如何说服编译器<3>是模板参数列表?

UPDATE

我终于设法创建了一个最小的例子,对不完整的问题抱歉:

template 
struct metre {
    double value;
    template 
    friend constexpr metre pow(metre const x) {
        return {0};
    }
};

int main() {
    pow<2>(metre<1>{1});
    return 0;
};

似乎没有看到战俘:

targs.cpp:11:2: error: use of undeclared identifier 'pow'
        pow<2>(metre<1>{1});
        ^

如果我包含cmath,我有与以前相同的诊断:

targs.cpp:13:5: error: comparison between pointer and integer ('double (*)(double, double)' and 'int')
        pow<2>(metre<1>{1});
        ~~~^~
1 error generated.

因此," 双重(双,双) "的存在只是掩盖了模板未被看到的问题.那么问题是,为什么编译器看不到pow <>()?

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有