【问题标题】:Parenthesis in templated type macro argument and I cannot use variadic macros [duplicate]模板类型宏参数中的括号,我不能使用可变参数宏[重复]
【发布时间】:2012-11-03 10:45:55
【问题描述】:

可能重复:
Trouble with template parameters used in macros

我正在想办法在不改变INHERIT的结构的情况下让它工作:

#define INHERIT(t) foo<t>
template<typename A, typename B>
struct bar : INHERIT(bar<A, B>) {};

问题是INHERIT 的调用包含逗号。

我正在尝试支持较旧的编译器,因此不能选择可变参数宏和模板别名。有没有办法解决这个问题?

【问题讨论】:

    标签: c++ templates macros c++03


    【解决方案1】:

    使用一些棘手的宏:

    #define A2(t1,t2) t1,t2
    #define A3(t1,t2,t3) t1,t2,t3
    #define A4(t1,t2,t3,t4) t1,t2,t3,t4
    #define INHERIT(t) foo< t >
    template<typename A, typename B>
    struct bar : INHERIT(bar<A2(A, B)>) {};
    

    这些宏导致预处理器停止将逗号视为其语法 - 逗号开始仅被视为参数的一部分。

    另一种方式:

    #define bar_A_B bar<A,B>
    template<typename A, typename B>
    struct bar : INHERIT(bar_A_B) {};
    

    注意
    这些示例没有这些就无法编译:

    template <class T>
    class foo {};
    

    【讨论】:

    • 仍然无法在 vs2012 上编译。错误 C2143:语法错误:在 ' 之前缺少 ','
    • @billz 在您的程序中缺少foo&lt;T&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 2023-04-11
    • 2011-11-03
    相关资源
    最近更新 更多