将#define VALUE与模板一起使用

时间:2014-09-13 09:41:08

标签: c++

我无法将定义的值传递给模板。即使是简单的计算也不起作用:

    #define IR_TIMEOUT 564*173/2
    return decodeSpace<IR_TIMEOUT>(
    duration);

    return decodeSpace<564*173/2>(
    duration);

工作:

    return decodeSpace<48786>(
    duration);

定义:

    template <uint16_t irTimeout>
    bool decodeSpace(unsigned long duration){}

错误:

  

E:\ Arduino \ sketchbook \ libraries \ IRLremote \ IRLprotocolNEC.cpp:在成员函数&#39;虚拟bool IRLprotocolNEC :: decodeIR(long unsigned int)&#39;:   E:\ Arduino \ sketchbook \ libraries \ IRLremote \ IRLprotocolNEC.cpp:46:11:错误:没有匹配函数来调用&#39; IRLprotocolNEC :: decodeSpace(long unsigned int&amp;)&#39;      持续时间);              ^   E:\ Arduino \ sketchbook \ libraries \ IRLremote \ IRLprotocolNEC.cpp:46:11:注意:候选人是:   在E:\ Arduino \ sketchbook \ libraries \ IRLremote / IRLprotocolNEC.h:27:0中包含的文件中,                    来自E:\ Arduino \ sketchbook \ libraries \ IRLremote \ IRLprotocolNEC.cpp:24:   E:\ Arduino \ sketchbook \ libraries \ IRLremote / CIRLremote.h:103:9:注意:模板bool CIRLprotocol :: decodeSpace(long unsigned int)       bool decodeSpace(无符号长持续时间){            ^   E:\ Arduino \ sketchbook \ libraries \ IRLremote / CIRLremote.h:103:9:注意:模板参数扣除/替换失败:   E:\ Arduino \ sketchbook \ libraries \ IRLremote \ IRLprotocolNEC.cpp:46:11:错误:常量表达式溢出[-fpermissive]      持续时间);              ^   E:\ Arduino \ sketchbook \ libraries \ IRLremote \ IRLprotocolNEC.cpp:46:11:注意:在模板参数中输入&#39; unsigned int&#39;

这是一个错误还是一个功能?或者更好:我如何避免/解决这样的事情?

我想创建具有相同结构但不同时序的不同不同解码功能。传递值需要大量闪光,所以我最好一遍又一遍地复制这个功能。 Thatswhy我想使用模板。

2 个答案:

答案 0 :(得分:1)

问题是564 * 173溢出uint16。

对于常量折叠,使用define或直接表达式是一回事。

常量折叠是编译器“扩展”表达式的事实。例如,将“2 * 3”替换为“6”。

答案 1 :(得分:0)

问题是我需要将计算本身声明为:

定义IR_TIMEOUT 564UL * 173/2

Thx @ Matt McNabb