0

이 코드의 잘못된 점은 무엇입니까? 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); 

나는 just as in MSDN 로깅을위한 가변/재귀 템플릿을 만들려고하지만, 난 그냥 오류 C3520 ( C3520: 'P' : parameter pack must be expanded in this context.)를 제거 할 수 없습니다. 내가 잘못하고있는 일이 있습니까, 아니면 (신이 금지 한) 컴파일러 버그입니까?

+1

오류 C3520은 무엇인가? –

+0

조금 더 자세히 설명해주세요! 문자 그대로 질문에 상태 오류 메시지를 표시하고 오류가 발생한 위치에 줄을 표시하십시오. –

+0

질문에 명확히 설명되어 있습니다. 죄송합니다. 통지에 너무 좌절했습니다. – DarkWanderer

답변

4

필요

  1. rest 요구가 확대 될 :

  2. Write

    Write(level, ss, rest...); 
    
  3. 는 다음과 같이 로그 수준을하도록되어 첫 번째 인수 :

    좌변 기준에
    Write(GetLogLevel(), std::stringstream(), "Hello", (const char*)" World!", 1); 
    
  4. 당신은 통과하지 수있는 임시 std::stringstream :

    std::stringstream ss; 
    Write(GetLogLevel(), ss, "Hello", (const char*)" World!", 1); 
    
+0

포인트 3은 실제로 올바르지 않습니다. P1이 무엇이 문제인지, 고마워요! 다른 정답 첫 번째. – DarkWanderer

+0

@DarkWanderer 정확하지 않습니까? 일시적으로 통과하면 작동하지 않아야합니다. 편집 : 먼 메모리가 MSVC 확장이 될 수 있다고 말하고 있습니까? –

+0

작동하려면 _supposed_ 아니지만 VC++ 확장 (확장 4 경고로 진단 진단으로) 비 const lvalue 참조에 임시 바인딩을 허용합니다. 기술적으로 코드는 매우 잘못되었으며 이식성이 없습니다. – ildjarn

2

당신은 아마 나는 다음과 같은 문제를 참조

Write(level, ss, rest...); 
//     ^^^ Note these dots! 
+0

젠장, 놓쳐 버렸습니다 ...이 답변이 처음 이었기 때문에 받아 들였습니다. (만기 직위) Joseph Mansfield의 것이 너무 귀중합니다. – DarkWanderer

+0

@DarkWanderer 조셉의 대답을 받아주십시오. 누가 첫 번째인지에 대해서만 있으면 안되며, 여분의 마일로가는 사람들에게 보상을해주어야하고, 당신이 요청한 것보다 더 많은 * 도움을 제공해야합니다. –

+0

손을 내려 놓고, 질문하지 않고, 그냥하고 있습니다! :) – DarkWanderer