gpt4 book ai didi

C++ 预处理器不知道模板参数?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:57:38 25 4
gpt4 key购买 nike

看起来,如果将具有多个参数的模板实例化作为参数传递给宏,C++ 预处理器将失败。

请参阅下面的示例。

#include <stdio.h>

#define FOO(v) printf("%d\n",v::val())

template<int N>
struct bar {
static int val() { return N; }
};
template<int N, int M>
struct baz {
static int val() { return N+M; }
};

int main() {
printf("%d\n",bar<1>::val());
printf("%d\n",baz<1,2>::val());
FOO(bar<10>); // OK
FOO(baz<20,30>); // error: too many arguments provided to function-like macro invocation
FOO((baz<20,30>)); // error: '::val' has not been declared
}

Tested使用 clang++ 和 g++

它应该被认为是一个错误吗?

最佳答案

不,这不是错误。

C 预处理器与其他语言不同,它按照自己的规则运行。改变这一点会极大地破坏兼容性,CPP 是高度严格标准化的。

解决这些逗号问题的常用方法是,

typedef baz<20,30> baz2030_type;
FOO(baz2030_type);

关于C++ 预处理器不知道模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32241581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com