2010-08-05 4 views
0

클래스 멤버 함수 내에 함수 객체를 정의하여 예를 들어 std :: transform 함수와 같이 직접 사용할 수 있는지 궁금합니다.
나는 그 예가 약간 어리 석다는 것을 안다. 내가 직면 한 문제를 보여 주기만하면된다.클래스 멤버 함수 내에서 함수 객체 선언 및 정의

파일 "example.h"

class Example { 
    public: 
    //.. constructor and destructor stuff 
    std::string toString() const; //Converts 'mVal' to a std::string 

    private: 
    std::vector<int> mVal; //Only one digit numbers are allowed ([0-9]) 
} 

파일 "example.cpp"나는처럼 멤버 함수 내부에 직접 함수 객체를 구현하기 위해 노력 이래로

std::string Example::toString() const 
{ 
    //The functor which should be used in std::transform 
    struct { 
    char operator()(const int number) { 
     char c; 
     //"Convert" 'number' to a char 
     return c; 
    }; 
    } functor; 

    //Transform the integers to char 
    std::string str(mVal.size(), '0'); //Allocate enough space 
    std::transform(mVal.begin(), mVal.end(), str.begin(), functor); 
    return str; 

};//toString() 

"example.cpp ", 코드가 컴파일되지 않습니다. 내가 오류 메시지는 다음과 같습니다

error: no matching function for call to ‘transform(__gnu_cxx::__normal_iterator<const int*, std::vector<int, std::allocator<int> > >, __gnu_cxx::__normal_iterator<const int*, std::vector<int, std::allocator<int> > >, __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, Example::toString() const::<anonymous struct>&)’ 

그래서 내가 :: 변환 표준의 구조체 "펑"를 사용할 때 문제가 온다 생각합니다. 누군가 문제가 무엇인지 말해 줄 수 있습니까?

사용 : 우분투 리눅스에서
gcc-4.2 컴파일러를 사용 중입니다.

미리 감사드립니다.
René.

+0

이의 http://stackoverflow.com/questions/2662843/c-can-local-class-reference-be-passed-to-a-function –

+0

가능한 중복을 참조하십시오 [STL 알고리즘으로 로컬 클래스 사용하기] (http://stackoverflow.com/questions/742607/using-local-classes-with-stl-algorithms) –

+0

네, 맞습니다. 정확한 검색어를 몰랐습니다. – PiJ

답변

4

, 당신은 함수 영역과 유형을 사용할 수 없습니다 (또는 이름 없음)을 템플릿 매개 변수로 사용합니다. 당신은 그러나 펑터 매개 변수로 로컬 유형의 정적 멤버 함수를 사용할 수 있습니다

int main() 
{ 
    struct F { 
     static int fn(int x) 
     { 
      return x+x; 
     } 
    }; 

    int v[5]={1,2,3,4,5}; 
    std::transform(v+0,v+5,v+0,F::fn); 
} 

당신이 당신의 기능에 로컬 상태로 필요 유형의 삭제 관용구에 의존하지 않으려면, 당신이 할 수있는 멀리 지방 유형을 주조로 속임수 :

int main() 
{ 
    struct F { 
     int k; 
     int call (int n) const 
     { 

      return n+k; 
     } 
     static int fn(void *p, int x) 
     { 
      return ((F*)p)->call(x); 
     } 
    }; 

    int v[5]={1,2,3,4,5}; 
    F f; 
    f.k=123; 
    std::transform(v+0,v+5,v+0,std::bind1st(std::ptr_fun(F::fn),(void*)&f)); 
} 
+0

람다 표현을위한 15 줄 ...하지만 그래,이 문제를 해결합니다. –

+0

첫 번째 예는 트릭을 수행합니다. 저것을위한 감사합니다 :). – PiJ

2

슬프게도, 이것은 작동하지 않습니다. 표준 템플릿 인수로 사용되는 로컬 클래스를 허용하지, 그래서 접근 방식은 (누군가가, 표준의 관련 부분을 인용하시기 바랍니다) 실패

14.3.1/2 : "로컬 형, 유형을유형이 과 결합 된 경우 템플릿 인수로 사용할 수 없습니다. type-parameter. "

C++ 0x 컴파일러에 대한 액세스 권한이있는 경우이 방법도 사용할 수 있습니다.

현지 클래스는 강력한 수 있었다, 그러나 그들의 사용은 "유형 삭제 관용구"다소 제한 : 알렉산더가 이미 지적했듯이

struct abstract_foo { ... }; 

template <typename T> 
abstract_foo* make_concrete_foo(...) 
{ 
    struct foo : abstract_foo 
    { 
     // Depends on T 
    }; 

    return new foo(...); 
} 
+0

ISO/IEC 14882-14.3.1/2 : "로컬 타입, 연결이없는 타입, 이름없는 타입 또는이 타입들로부터 복합 된 타입은 템플릿 *에 대한 * template-argument *로 사용되어서는 안된다. 유형 매개 변수 *. " –

+0

불행히도 나는 C++ 0x- 컴파일러를 아직 사용할 수 없다. 그러나 어쨌든 답변을 주셔서 감사합니다. 곧 출시 될 표준에 있음을 알고 있습니다. – PiJ

+0

@ pij82 : 포기하기 전에 루터의 대답을보십시오, 당신의 필요에 충분합니다. –

관련 문제