【问题标题】:C++ too few arguments for class template "*" when it's wrapped in a macro当类模板“*”包装在宏中时,C++ 的参数太少
【发布时间】:2014-04-03 10:47:45
【问题描述】:

这是我的代码。

#define mp_eval(Func)       Func::value

template<int L, int R>
struct StaticMinimum
{
    static const int value = (L < R) ? L : R;
};
// Error: too few arguments for class template "StaticMinimum"
cout << mp_eval(StaticMinimum<9, 12>) << endl;

mp_eval(StaticMinimum&lt;9, 12&gt;) 不是要被编译器替换为StaticMinimum&lt;9, 12&gt;::value 吗?我想我一定错过了什么。请告诉我发生了什么。

【问题讨论】:

  • 你看过预处理的输出吗?看看这个:ideone.com/GuDwei
  • 你不能在宏参数中传递逗号,除非你在整个参数周围加上括号。
  • 你能用内联函数或模板函数替换宏吗?
  • @MattMcNabb 我已经考虑过了。但我仍然不知道该怎么做。你能告诉我你是怎么处理的吗?

标签: c++ templates macros template-meta-programming


【解决方案1】:

使用宏时的逗号 (mp_eval(StaticMinimum&lt;9, 12&gt;)) 被解析为参数分隔符。

宏可以固定为:

#define mp_eval(...)       __VA_ARGS__::value

在 C++1y 中,您可以使用变量模板而不是宏。

【讨论】:

    【解决方案2】:

    预处理器将 9 到 12 之间的逗号视为宏的分隔参数。

    将表达式包装在额外的 () 中以停止此操作。

    cout << mp_eval((StaticMinimum<9, 12>)) << endl;
    

    更新:正如 Ggicci 在 cmets 中指出的那样,这种解决方案在这种特定情况下是不可能的:它将导致 (StaticMinimum&lt;9, 12&gt;)::value 不是有效的 C++。

    【讨论】:

    • 此解决方案不能解决这种情况,因为它会导致另一个问题:'value' : is not a member of '`global namespace'''value' : undeclared identifier。就像(StaticMinimum&lt;9, 12&gt;)::value 一样。
    猜你喜欢
    • 2021-04-19
    • 2019-09-08
    • 1970-01-01
    • 2022-11-05
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 2020-07-31
    • 1970-01-01
    相关资源
    最近更新 更多