【问题标题】:Macro define for type is not working类型的宏定义不起作用
【发布时间】:2016-09-23 12:09:47
【问题描述】:

为什么下面的代码不起作用?

// Template function definition
template <typename T>
void apply(const T& input);

// Helper macro definition
#define APPLY_FUNCTION(PIXELTYPE) \
  apply<##PIXELTYPE>(input);

// Use macro to call function
APPLY_FUNCTION(uint8_t);

这会产生以下错误:

错误:粘贴“

【问题讨论】:

  • 即使你修复了宏,你在哪里得到input 传递给函数?
  • 宏不以分号结尾。
  • 并不是说你错了,但在你的宏中包含 input 似乎并不是你可以选择的最佳做法。

标签: c++


【解决方案1】:

## 用于将标记粘贴在一起。你不需要那个,所以只需:

#define APPLY_FUNCTION(PIXELTYPE) apply<PIXELTYPE>(input);

也就是说,有两条准则:

  1. 不要以; 结束宏。要求用户添加它可以避免一些错误。
  2. 请不要写这个宏。

【讨论】:

    【解决方案2】:

    为什么还要指定模板参数的类型呢?如果你不是特别想要一个宏,那么直接使用你的 apply 函数就可以了:

        template <class T>
        void apply(const T & input)
        {
            //...
        }
    
        apply(1.0f); // Will instantiate apply<float> to match the input's type
    

    如果您希望T 类型与传入的类型不同,那么我建议改为使用以下模板:

        template <class T, class Input>
        void apply(const Input & input)
        {
            T t(input);
            //...
        }
    

    然后可以调用:

        apply<uint8_t>(1.0f);
    

    而且根本不需要这个宏。

    【讨论】:

      【解决方案3】:

      在宏扩展中,## 告诉编译器将它前面的标记与它后面的标记组合起来,并将结果视为单个标记。如错误消息所述,&lt;uint8_t 不是有效令牌。只需摆脱##。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-29
        相关资源
        最近更新 更多