VS2013中的可变参数模板分辨率-错误C3520 [英] Variadic template resolution in VS2013 - Error C3520
本文介绍了VS2013中的可变参数模板分辨率-错误C3520的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
此代码有什么问题?
enum LogLevel {
LogLevel_Error = 1,
LogLevel_Warning = 2,
LogLevel_Info = 3,
LogLevel_Debug = 4
};
LogLevel GetLogLevel() {return LogLevel_Debug;};
void Write(const std::string& message) {};
void Write(LogLevel level, std::stringstream& ss) {
if (level > GetLogLevel())
return;
Write(ss.str());
}
template<typename Arg> void Write(LogLevel level, std::stringstream& ss, Arg arg) {
if (level > GetLogLevel())
return;
ss << arg;
Write(ss.str());
}
template<typename First, typename... Rest> void Write(LogLevel level, std::stringstream& ss, First first, Rest... rest) {
if (level > GetLogLevel())
return;
ss << first;
Write(level, ss, rest); // Error C3520, see below
}
Write(std::stringstream(), "Hello", (const char*)" World!", 1);
我试图创建用于记录的递归/变量模板,就像在MSDN中一样,但我无法消除错误C3520( C3520:'P':必须在这种情况下扩展参数包.
).我有做错什么吗,还是(禁止)编译器错误?
I tried to create a recursive/variadic template for logging just as in MSDN, but I just can't rid of error C3520 (C3520: 'P' : parameter pack must be expanded in this context.
). Is there something I'm doing wrong, or is it (god forbid) a compiler bug?
推荐答案
我看到以下问题:
-
rest
需要扩展:
Write(level, ss, rest...);
Write
应该以日志级别作为其第一个参数:
Write
is supposed to take a log level as its first argument:
Write(GetLogLevel(), std::stringstream(), "Hello", (const char*)" World!", 1);
您不能将临时 std :: stringstream
传递给左值引用:
std::stringstream ss;
Write(GetLogLevel(), ss, "Hello", (const char*)" World!", 1);
这篇关于VS2013中的可变参数模板分辨率-错误C3520的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文