2014-12-20 2 views
3

정적 멤버 초기화에서 템플릿 매개 변수 이름의 GCC 가시성 대 (4.8.3 이상) :C++ (11) MSVS 난 그냥 MSVS2013는 GCC는 달리이 코드 불평 이유를 물어보고 싶은

msvs2013에서
template <typename T> 
struct MyClass 
{ 
    typedef std::function<T*()> FunctionType; 
    static FunctionType funcObj; 
}; 

template <typename T> typename MyClass<T>::FunctionType MyClass<T>::funcObj = 
    []{return new T();}; 

, 오류 1 오류 C2061 : 구문 오류 :

template <typename T> 
struct MyClass 
{ 
    typedef std::function<T*()> FunctionType; 
    static FunctionType funcObj; 

    static T* foo() 
    { 
     return new T(); 
    } 
}; 

template <typename T> typename MyClass<T>::FunctionType MyClass<T>::funcObj = 
    MyClass<T>::foo; 

참고 : 식별자 'T'

그리고 해결하기 위해, 내가이 그것을 수정해야 함이 불만 'MyClass에,432 10 T> :: '는 마지막 행에서 필요하지 않습니다. 나는 T가 연산의 오른쪽에 여전히 사용 가능하다는 것을 암시하고 싶다. 그리고 T가 람다 내부에있을 때 더 이상 사용할 수 없다.

현재 표준에서 어느 것을 올바르게 준수합니까? 그런 경우 람다에서 typename을 사용할 수있는 방법이 있습니까?

미리 감사드립니다.


편집

문제는 첫 번째 버전이 너무 MSVS에서 작동하도록, 현재 버전에서 수정 될 것으로 보인다.

+0

당신이 대략 C++ (11) 또는 C++ 14을 얘기하는 겁니까? – 5gon12eder

+0

나는 C++ 11에 대해 말하고있다. –

+0

나는 언어 변호사가 아니지만 신중하게 코드를 다시 읽은 후에 말할 수 있는데, 이것이 왜 C++ 11이 유효하지 않아야하는지 알 수 없다. 어쨌든, 이것으로 무엇을 의미합니까? * "그런 경우 람다에서 typename을 사용할 수있게 할 수있는 방법이 있습니까?"* – 5gon12eder

답변

2

MSVC가 호환되지 표준입니다 ... 물론 Connect에 버그보고를 할 수 있습니다 :

정적 데이터 멤버의 정의에서 초기화 식

명확 클래스의 범위에 템플릿 파라미터 T 따라서 그 이름의의 이니셜로 제공되어야 템플릿 클래스의 범위에 정적 멤버 funcObj. 람다은 포함하는 범위의 유형을 상속하므로이 버전 표준 준수 :

template <typename T> typename MyClass<T>::FunctionType MyClass<T>::funcObj = 
[]{return new T();}; 
+0

좋은 발견 - 감사합니다. 그걸 upvote :) Visual Studio 남자들과 버그 리포트를 파일하는 것을 잊지 마세요! – LThode

+0

@LThode가 나를 데려갔습니다 :-) – user1978011

+0

고마워요 !!! 적어도 나는 의심할만한 사람이 아닙니다 :) MSVS가 C++와 관련하여 표준을 준수하기를 바랍니다. Intellisense는 매우 유용합니다. –

1

MSVC는 여기에서 틀린 위치에 있습니다. 나는 Godbolt을 확인했고 Clang, ICC 및 GCC는 모두 #include <functional>이 앞에 박히면 첫 번째 코드를 허용합니다. 표준 말한다 때문에 당신은 (§9.4.2 [class.static.data),

+0

나는 광범위한 컴파일러의 쿼럼이 아닌 표준을 언급하는 대답을 선호합니다. – user1978011

+0

@ user1978011 - n3797에서 몇 가지 점을 확인했지만 람다 구문에 대해 아무 것도 발견하지 못했습니다. 나는 계속 볼 수 있다고 생각합니다 ... – LThode

관련 문제