C++ 可变模板未打印最后一个参数

C++ 可变模板未打印最后一个参数,c++,variadic-templates,C++,Variadic Templates,为了我的理解,我正在尝试使用可变模板编写一个简单的记录器。它是有效的,但有一个陷阱 void log() { std::cout << std::endl; } // variadic Template template<class T, class... Args> void log(T t1, Args... args) { std::cout << t1<<" ";

为了我的理解,我正在尝试使用可变模板编写一个简单的记录器。它是有效的,但有一个陷阱

void log() {
    std::cout << std::endl;
}
// variadic Template
template<class T, class... Args>                
void log(T t1, Args... args) {          
    std::cout << t1<<" ";
    log(args...);
}

int main()
{
    log("Logging", 1, 2, 3.2, 4);
    return 0;
}
void log(){

std::cout在VisualStudio中,对类似的std函数名使用名称空间是否更好

在全局命名空间中,
log(4)
的调用求值为宏
\u GENERIC\u MATH1(log,\u CRTDEFAULT)
定义在
xtgmath.h

#include/-这间接包括来自^^^^^^^
名称空间mylog{
无效日志(){}
//可变模板
模板
无效日志(t1,Args…Args)
{

std::cout在VisualStudio中,对类似的std函数名使用名称空间是否更好

在全局命名空间中,
log(4)
的调用求值为宏
\u GENERIC\u MATH1(log,\u CRTDEFAULT)
定义在
xtgmath.h

#include/-这间接包括来自^^^^^^^
名称空间mylog{
无效日志(){}
//可变模板
模板
无效日志(t1,Args…Args)
{

STD::CUT< P>问题是VisualC++将插入全局命名空间。

您的呼叫链应该是

log("Logging", 1, 2, 3.2, 4);
log(1, 2, 3.2, 4);
log(2, 3.2, 4);
log(3.2, 4);
log(4);
log();
< VisualC++的问题是,下一个调用,即代码>日志(4)< /C>,实际上是<代码> STD::(4)< />代码,当然不会调用自己的“代码>日志<代码>函数。< /P>

最简单的解决方案是将函数重命名为其他。

< P>问题是VisualC++插入全局命名空间。< /P> 您的呼叫链应该是

log("Logging", 1, 2, 3.2, 4);
log(1, 2, 3.2, 4);
log(2, 3.2, 4);
log(3.2, 4);
log(4);
log();
< VisualC++的问题是,下一个调用,即代码>日志(4)< /C>,实际上是<代码> STD::(4)< />代码,当然不会调用自己的“代码>日志<代码>函数。< /P>
最简单的解决方案是将您的函数重命名为其他函数。

在这里效果很好:在Visual Studio 2017中,我的函数也会发生同样的情况,仅打印3个。2@DarkFalcon有趣..我正在使用Visual Studio 2017,根本无法获取此输出。我重新生成并更改了参数等,打印新输出,但始终跳过最后一个参数,并换行符。在这里效果很好:同样的事情发生在我的Visual Studio 2017中,只打印了3张。2@DarkFalcon有趣。我正在使用Visual Studio 2017,根本无法获取此输出。我重新生成并更改了参数等,打印新输出,但始终跳过最后一个参数和换行符。如果日志(4);不调用他的模板日志函数,如果它不带任何参数,它如何调用它上面的非模板函数?你的意思是该名称(
log
)已经“转储”到全局命名空间中了吗?@Zebrafish非模板函数在重载解析过程中总是比较可取的@考えネロク 是的。似乎某些系统头文件包含
而不是
。请注意!如果我传递了一个字符串作为最后一个参数,它会按预期工作。如果log(4);不调用其模板日志函数,如果它不带任何参数,它如何调用其上方的非模板日志函数?您的意思是该名称(
log
)是否已“转储”到全局命名空间中?@Zebrafish非模板函数在重载解析期间始终是首选@考えネロク 是的。似乎某些系统头文件包含
而不是
。请注意!如果我将字符串作为最后一个参数传递,它将按预期工作。