2009-04-12 6 views
48

저는 항상 STL 알고리즘에 대한 술어로 로컬 정의 클래스를 사용할 수없는 이유가 궁금합니다. 질문에 STL 알고리즘에서 로컬 클래스 사용

: Approaching STL algorithms, lambda, local classes and other approaches, BubbaT 언급은 ' 은 C++ 표준의 인수에 사용하기 위해 지역 유형을 금지하기 때문에'라고 말한다

예제 코드 :

int main() { 
    int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
    std::vector<int> v(array, array+10); 

    struct even : public std::unary_function<int,bool> 
    { 
     bool operator()(int x) { return !(x % 2); } 
    }; 
    std::remove_if(v.begin(), v.end(), even()); // error 
} 

사람이 어디에서 알고 있나요 표준은 제한 사항입니까? 지역 유형을 허용하지 않는 이유는 무엇입니까?


편집 : C++ 11, 템플릿 인자로 로컬 타입을 사용하는 것이 합법적이기 때문에.

답변

50

명시 적으로 C++ 98/03 표준에 의해 금지되어 있습니다.

C++ 11 해당 제한을 제거하십시오.

더 완료하려면 이 기사는 C++ 03의 14.3.1 (및 C에 나열되어 템플릿 매개 변수로 사용되는 유형에 대한

제한 사항 ++ 98) 표준 :

로컬 형 아니 링키지 유형, 익명의 유형이나 종류 사용되지 않는다 이러한 유형의 배합에서 템플릿 유형 매개 변수의 템플릿 인수로 사용합니다.

template <class T> class Y { /* ... */ }; 
void func() { 
     struct S { /* ... */ }; //local class 
     Y<S> y1; // error: local type used as template-argument 
     Y< S* > y2; // error: pointer to local type used as template-argument } 

소스 및 자세한 내용 : http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=420

가 정리해하려면, 제한은 오늘 말했다 표준이 빠르게 변화하는 경우 빨리 해결 된 것 실수 ...

이었다 일반적인 컴파일러의 마지막 버전은 람다 식을 제공함과 함께 그것을 허용합니다.

+0

나는 알고있다. 그러나 나는 왜 내가 이해할 수 있는지 알기를 원한다. 표준에 대한 언급이 있습니까? –

+0

14.3.1.2, "템플릿 유형 인수"를 언급하고 있습니까? – greyfade

+0

몇 가지 정보와 도움이 될만한 링크를 추가했습니다. 요약하면 표준이 빠르게 발전하는 경우 신속하게 수정 된 실수였습니다 ... – Klaim

5

제한 사항은 '0x'에서 제거되지만 사용자가 많이 사용하지 않을 것이라고 생각합니다. 그리고 그것은 C++ - 0x가 lambdas를 가질 것이기 때문입니다! :)

int main() { 
    int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
    std::vector<int> v(array, array+10); 

    std::remove_if(v.begin() 
       , v.end() 
       , [] (int x) -> bool { return !(x%2); }) 
} 

위의 구문이 완벽하지는 않지만 일반적인 생각이 있습니다.

+0

나는 람다에 대해 알고 있었다. 사실 내가 달성하기를 원하는 것은 현재 표준과 가능한 가장 가까운 것입니다. 자바가 제안하는 솔루션의 종류. –

+0

그리고 이것이 실제 질문에 대한 답입니다. –

+0

@ChristianRau :;) 왜 이렇게 말할 수 있는지 알 수 있습니다. 질문은 왜 그들이 허용되지 않고 대답의 첫 번째 줄이 즉을 다루는가입니다. 그것은 제거되었으므로 제한에 대한 충분한 이유가 없어야합니다. 당시 나는 람다가 언급할만한 가치가 있다고 생각했다. 이제 3 년 후 람다 (lambda)는 잘 알려져 있으므로 더 이상 소식이 없습니다! –

관련 문제