정적 멤버 초기화에서 템플릿 매개 변수 이름의 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에서 작동하도록, 현재 버전에서 수정 될 것으로 보인다.
당신이 대략 C++ (11) 또는 C++ 14을 얘기하는 겁니까? – 5gon12eder
나는 C++ 11에 대해 말하고있다. –
나는 언어 변호사가 아니지만 신중하게 코드를 다시 읽은 후에 말할 수 있는데, 이것이 왜 C++ 11이 유효하지 않아야하는지 알 수 없다. 어쨌든, 이것으로 무엇을 의미합니까? * "그런 경우 람다에서 typename을 사용할 수있게 할 수있는 방법이 있습니까?"* – 5gon12eder