为什么以下代码不起作用?
// 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;不提供有效的预处理 令牌
答案 0 :(得分:8)
##
用于粘贴令牌。你不需要那样,所以只是:
#define APPLY_FUNCTION(PIXELTYPE) apply<PIXELTYPE>(input);
那就是两个指导方针:
;
结束您的宏。要求用户添加它将为您节省一些错误。答案 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);
//...
}
根本不需要这个宏。