类型的宏定义不起作用

时间:2016-09-23 12:09:47

标签: c++

为什么以下代码不起作用?

// 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);

这会产生以下错误:

  

错误:粘贴&#34;&lt;&#34;和&#34; uint8_t&#34;不提供有效的预处理   令牌

3 个答案:

答案 0 :(得分:8)

##用于粘贴令牌。你不需要那样,所以只是:

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

那就是两个指导方针:

  1. 请勿使用;结束您的宏。要求用户添加它将为您节省一些错误。
  2. 请不要写这个宏。

答案 1 :(得分:0)

在宏扩展中,##告诉编译器将其前面的标记与其后面的标记组合,并将结果视为单个标记。如错误消息所示,<uint8_t不是有效令牌。摆脱##

答案 2 :(得分:0)

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

$tz->getOffset(new \DateTime());

如果您希望类型 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);
        //...
    }

根本不需要这个宏。