2011-07-30 4 views
7

때로는 목록을 조작하기 위해 일부 functor-helper가 필요합니다. 범위를 가능한 한 로컬로 유지하려고합니다.함수 안에 함수를 정의하는 방법


hello.cpp: In function ‘int main()’: 
hello.cpp:18:34: error: no matching function for call to ‘transform(int [5], int*, int [5], main()::Square)’ 

#include <iostream> 
#include <algorithm> 
using namespace std; 

int main() 
{ 
    struct Square 
    { 
     int operator()(int x) 
     { 
      return x*x; 
     } 
    }; 

    int a[5] = {0, 1, 2, 3, 4}; 
    int b[5]; 

    transform(a, a+5, b, Square()); 

    for(int i=0; i<5; i++) 
     cout<<a[i]<<" "<<b[i]<<endl; 
} 
내가 main()에서 Square를 이동하는 경우, 그것은 괜찮습니다.

+0

[이 질문 참조] (http://stackoverflow.com/questions/6880077/why-does-this-stdsort-predicate-fail-when-the-class-is-inside-main). – hammar

+0

흠 ... 질문에서 코드를 복사하여 VS2010에서 시도해 보았지만 정상적으로 작동합니다. : - \. – TCS

답변

6

할 수 없습니다. 그러나 어떤 경우에는 boost::bind 또는 boost::lambda 라이브러리를 사용하여 외부 구조를 선언하지 않고 펑터를 작성할 수 있습니다. 또한, 당신은 당신이 같은 구문을 허용 ++ 당신이 람다 표현식을 사용할 수 있도록 0X 기능을 새로운 C를 활성화 할 수 있습니다 (예 : GCC 4.5 버전으로) 최근의 컴파일러가있는 경우 : 현재의 표준에서

transform(a, a+5, b, [](int x) -> int { return x*x; });

+0

+1 "0x 할 수 있습니다"메모. – bitmask

6

을 (C++ 98/03) 로컬 클래스 (로컬 펑터)는 템플릿 매개 변수로 클래스로 사용할 수 없습니다.

-1

이 질문에 대한 최선의 대답은 "functional 프로그래밍 언어 사용"입니다.

+2

태그는 질문의 일부이기 때문에이 질문과 다소 비슷한 질문에 대한 답변이지만이 질문에 대한 대답은 아닌 것 같습니다. –

0

여기에 몇 가지 대답으로 지적했듯이 C++ pre-0x는 템플릿 형식으로 로컬 형식을 사용할 수 없습니다. 이 문제를 피하기 위해 내가 일반적으로하는 일은 (내가하는 프로젝트가 C++ 0x로 곧 바뀔 것이라는 기대 외에도)이 함수를 필요로하는 멤버 함수의 클래스에서 각각의 로컬 클래스를 private 중첩 클래스로 두는 것입니다. 또는, 때로는 펑터를 각각의 .cpp 파일에 넣고, 그것이 더 깔끔하고 (컴파일 속도가 약간 더 빠름) 상상해보십시오.

관련 문제