template<typename T> void log(const T& t) { std::cout << t; } template<typename ...T> void log(const T&... data) { std::cout << data...; } template<typename ...T> void infof(const T& ...data) { std::cout << "\033[32;1m"; log(data...); std::cout << "\033[0m" << std::endl; }以上代码编译报错为“Def.h: In function ‘void log(const T& ...)’: Def.h:13:19: error: expected ‘;’ before ‘...’ token std::cout << data...; ^~~ Def.h:13:12: error: parameter packs not expanded with ‘...’: std::cout << data...; ~~~~^”,什么原因?怎么解决?
时间: 2024-02-28 10:53:30 浏览: 161
cpp代码-模板 泛型 template<typename> template<class>
这个错误是因为在函数模板`log`的可变参数模板中,`data`参数没有被展开。正确的写法应该是使用展开运算符`...`,如下所示:
```
template<typename ...T> void log(const T&... data) {
(std::cout << ... << data);
}
```
这个函数模板可以展开多个参数,并通过`...`展开运算符将这些参数连接到一起,然后输出到标准输出流中。在函数模板`infof`中调用`log`函数时,也应该使用展开运算符`...`,如下所示:
```
template<typename ...T> void infof(const T& ...data) {
std::cout << "\033[32;1m";
log(data...);
std::cout << "\033[0m" << std::endl;
}
```
这个函数先输出一个绿色的提示信息,并调用函数模板`log`来输出参数。最后输出一个换行符,表示输出结束。
阅读全文