2012-07-01 1 views
1

I는 다음과 같습니다 클래스가 있습니다 클래스 외부함수 템플릿 클래스 멤버 내의 변환 알고리즘 매개 변수에서 단항 연산자 함수를 가리키는 방법은 무엇입니까?

class A 
{ 
    public: 
     class variables_map vm /*! A boost::program_options variable map containing all program_options in use. */; 
     char sep_to_space(char c); 
     template <typename T> 
     void VectorFromOption(char * sOption, vector<T> & n); 
}; 

char A::sep_to_space(char c){ 
    return c == ',' || c == '<' || c == '>' ? ' ' : c; 
} 

template <typename T> 
void A::VectorFromOption(char * sOption, vector<T> & n) 
    string s=A::vm[sOption].as<string>(); 
    transform(s.begin(), s.end(), s.begin(), &A::sep_to_space); 
    stringstream ss(s); 
    copy(istream_iterator<T>(ss), istream_iterator<T>(), std::back_inserter(n)); 
} 

이 잘 작동을하지만, 나는 그들의 존재 반원의 맥락에서 transform의 4 번째 매개 변수로 sep_to_space()을 통과하는 올바른 방법을 찾을 수 없습니다. 내가 주석을 달면 모든 것이 컴파일되고 올바르게 실행됩니다. 현재 내 머리에, 난 두려워입니다

1>c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\algorithm(671) : error C2064: term does not evaluate to a function taking 1 arguments

:

&A::sep_to_space는 수수께끼 오류가 발생합니다. 제안?

답변

1

Asep_to_space도 (비 정적) 멤버? 어떤 회원도 액세스하지 않으며 분명히 할 필요도 없습니다. 무료 함수 또는 정적 멤버로 만들고 모든 것이 좋습니다.

일반적인 질문에 대답하려면 개체를 호출해야합니다. 이미 어쨌든 C++을 사용할 수 (11)이있는 경우 단지 람다 사용

#include <functional> // or <boost/bind.hpp> 

using std::placeholders::_1; // placeholder for the first argument 
std::transform(s.begin(), s.end(), s.begin(), std::bind(&A::sep_to_space, this, _1)); 

또는 :

std::transform(s.begin(), s.end(), s.begin(), 
    [this](char c){ 
     return sep_to_space(c); 
    }); 

하나의 옵션은 C++ 11 부스트에서 bind 기능을 사용하는 것입니다

+0

아직 C++ 11 지원이 없습니다. 나는 'VectorFromOption'을 .h 파일로 옮긴 후 범위를 유지할 다른 방법을 찾을 수 없기 때문에'sep_to_space' 멤버를 만들었습니다. 'sep_to_space'를 정적 멤버로 만드는 것이 최선의 해결책이라고 생각합니다. 고맙습니다. – jwilson75503

0

시도 :

using std::placeholders::_1; 
transform(s.begin(), s.end(), s.begin(), std::bind(&A::sep_to_space, this, _1)); 

(또는 부스트 : : 바인드)

+0

그대로,이 작동하지 않습니다. 'char' 인수에 대한 자리 표시자가 없습니다. – Xeo

+0

감사합니다. 다음 번에는 댓글을 게시하는 대신 대답을 편집하는 느낌이 3입니다. –