C++ 日志(PCTSTR格式,…)和日志(PCTSTR文本):错误C2668对重载函数的调用不明确
我有以下定义:C++ 日志(PCTSTR格式,…)和日志(PCTSTR文本):错误C2668对重载函数的调用不明确,c++,visual-studio-2010,visual-c++,C++,Visual Studio 2010,Visual C++,我有以下定义: void LogMessage(PCTSTR text); void LogMessage(PCTSTR format, ...); 如果我只想用一个参数调用函数,我会得到以下错误消息: Source.cpp(10): error C2668: 'Log' : ambiguous call to overloaded function could be 'void Log(PCTSTR,...)' or 'void Log(PCTSTR)' while trying t
void LogMessage(PCTSTR text);
void LogMessage(PCTSTR format, ...);
如果我只想用一个参数调用函数,我会得到以下错误消息:
Source.cpp(10): error C2668: 'Log' : ambiguous call to overloaded function
could be 'void Log(PCTSTR,...)' or 'void Log(PCTSTR)'
while trying to match the argument list '(const wchar_t [42])'
是否可以进行静态转换以解释使用第一个版本?或者,除了重命名第一个或第二个函数之外,这个问题可以解决吗?下面的方法如何?我还没有在VC++上进行测试(这似乎是您选择的平台),但希望您使用的版本能够实现足够的C++11,使其能够正常工作
#include <iostream>
#include <cstdio>
#include <cstdarg>
void LogMessageWorker(char const* format, ...)
{
// 1k should be enough for anyone... ;)
char buf[1024] = { 0 };
// The version of vsnprint called should always null terminate correctly and doesn't
// strictly need the -1 but I believe that the implementation that is included with
// VC++ leaves a lot to be desired so you may need to slightly tweak this.
va_list args;
va_start (args, format);
vsnprintf (buf, sizeof (buf) - 1, format, args);
va_end (args);
std::cout << "LogMessage: " << buf << std::endl;
}
template <class... Arguments>
void LogMessage(char const* format, Arguments... arguments)
{
LogMessageWorker (format, std::forward<Arguments>(arguments)...);
}
void LogMessage(char const* text)
{
LogMessageWorker ("%s", text);
}
int main(int argc, char **argv)
{
LogMessage ("The test is starting...");
for (int i = 0; i < 3; i++)
LogMessage ("This is test #%d", i);
LogMessage ("This contains the % character and still it works (%d-%d-%d-%d)");
return 0;
}
#包括
#包括
#包括
void LogMessageWorker(字符常量*格式,…)
{
//1k对任何人来说都足够了……;)
char buf[1024]={0};
//被调用的vsnprint版本应始终为null,并正确终止,且不会终止
//严格需要-1,但我相信
//VC++还有很多需要改进的地方,所以您可能需要稍微调整一下。
va_列表参数;
va_开始(参数,格式);
vsnprintf(buf,sizeof(buf)-1,格式,args);
va_端(args);
std::您是否只需要void LogMessage(PCTSTR格式,…);
No…如果有人使用Log(_T(“Log%text”))
我遇到了一个问题…这就是我想要两个函数的原因…第一个函数在内部调用第二个函数,使用Log(_T(“%s”),text);
..“不…如果有人使用Log(_T(“Log%text”))我会遇到问题…”在没有参数的情况下检查格式如何?如果你只是盲目地转发它,你会有一个问题是的。嗯…没有办法计算参数…问题是我有一个现有的大型代码库…有时字符串是在传递给此函数之前生成的…有时是在insert whi中使用的输入ch包含一个“%”……因此,我正在寻找一种“简单”的方法来处理这种情况,如果没有传递任何参数……您能用LogMessage()的当前实现扩展您的问题吗
functions please?可能有人知道如何从参数中获取它。这是一个非常好的解决方案,但它不适用于VS2010…它适用于VS2013…也许我必须咬紧牙关地浏览所有代码,找到带有一个参数的日志调用…有两个函数听起来是一个很好的解决方案,但也很容易出错。你有没有您考虑过使用可变宏吗?您需要解决另一个VC实现难题,如前所述,但它可以很好地工作。