【问题标题】:Use a #define VALUE with a template将 #define VALUE 与模板一起使用
【发布时间】:2014-09-13 09:41:07
【问题描述】:

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

    #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:在成员函数'virtual bool IRLprotocolNEC::decodeIR(long unsigned int)'中: E:\Arduino\sketchbook\libraries\IRLremote\IRLprotocolNEC.cpp:46:11: 错误: 没有匹配函数调用'IRLprotocolNEC::decodeSpace(long unsigned int&)' 期间); ^ 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:注意:在模板参数中,类型为 'unsigned int'

这是错误还是功能?或者更好:我怎样才能避免/解决这样的事情?

我想创建具有相同结构但不同时序的不同解码函数。传递值需要很多时间,所以我最好一遍又一遍地复制函数。这就是我想使用模板的原因。

【问题讨论】:

  • @Ever 这些是非类型模板参数。阅读。
  • 以什么方式失败?
  • 不要说“不起作用”,而是说出实际发生的事情以及您期望发生的事情。如果它可能是编译器错误,则包括您的编译器名称和版本
  • 无法在 clang 3.4.1、g++ 4.9.0 或 MSVC 2013 上重现。您使用的编译器/版本是什么?
  • 错误信息好像是说uint16_tunsigned int,你能确认你的平台有16位整数吗? (如果这是真的,那么写 564 * 173 会由于有符号的 int 溢出而导致未定义的行为)

标签: c++


【解决方案1】:

问题是 564*173 溢出 uint16。

当涉及到常量折叠时,使用定义或直接表达式是一样的。

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

【讨论】:

  • 无符号溢出是可以的并且定义明确。
  • @HolyBlackCat 564*173 有符号溢出(如果使用 16 位整数)
  • 奇怪的是我可以使用 66000 这是溢出但不是 564*60 这不应该是溢出。还是我的计算错了??
  • @NicoHood 66000 的类型可能是 long 如果 int 是 16 位。
【解决方案2】:

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

定义 IR_TIMEOUT 564UL*173/2

谢谢@马特麦克纳布

【讨论】:

  • 这不是您当前问题的根源,但如果您确实需要将常量定义为宏,请:在任何表达式周围加上括号,否则您会得到更多类似的意外。跨度>
猜你喜欢
  • 2019-02-01
  • 2016-06-02
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
  • 2014-09-08
  • 1970-01-01
  • 2012-09-15
  • 2011-06-03
相关资源
最近更新 更多