VS2013中的可变参数模板分辨率-错误C3520 [英] Variadic template resolution in VS2013 - Error C3520

查看:42
本文介绍了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?

推荐答案

我看到以下问题:

  1. 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屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆