Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 日志(PCTSTR格式,…)和日志(PCTSTR文本):错误C2668对重载函数的调用不明确_C++_Visual Studio 2010_Visual C++ - Fatal编程技术网

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实现难题,如前所述,但它可以很好地工作。