2012-01-20 5 views
0

I 변환을 사용하여 컴파일 오류에 직면하고있다 : C++: How to copy a string object to an int array?)C++ 오류

enter code here 

class BinaryCode { 

    public: 
      int get_digit(char c) 
      { 
        return c-'0'; 
      } 
      void decode(string decd) 
      { 
        int i; 

        std::vector<int>decoded(decd.size()); 
        std::transform(decd.begin(), decd.end(), decoded.begin(), get_digit); 

        int length=decoded.length(); 

오류는 다음과 같습니다 :

enter code here 

[[email protected] topcoder]# g++ prog1.c 
prog1.c: In member function `void BinaryCode::decode(std::string)': 
prog1.c:20: error: argument of type `int (BinaryCode::)(char)' does not match `int (BinaryCode::*)(char)' 

그것은 내 앞의 질문과 관련이

아무도 도와 줄 수 있습니까? gcc (g ++) 컴파일러를 사용하고 있습니다.

답변

7

가장 좋은 이럴

 static int get_digit(char c) 

그것은이 (정적 기능)와 함께 작동합니다에

 int get_digit(char c) 

의 정의를 변경하는 것입니다. 멤버 함수를 사용하여 변형 할 수는 있지만 약간 더 복잡합니다. 게다가, 당신은 그것을 필요로하지 않습니다.

+3

이렇게하거나 수업에서 완전히 삭제하십시오. –

+0

아 ... 일했습니다. 엄청 고마워. 하지만 왜 비 정적 멤버 함수가 마지막 매개 변수에서 가져올 수 있습니까? – kingsmasher1

+0

@jpaleck : 힌트 없음 ??? – kingsmasher1

2

멤버 함수가 아니라 마지막 매개 변수로 함수 또는 펑터를 전달해야합니다. 당신이 C++ 11 개 기능을 가지고 있지 않기 때문에, 당신은 (클래스의 외부) 기능으로, get_digit을 변환 할 수 있습니다

std::transform(decd.begin(), decd.end(), decoded.begin(),[this](const char it){ this->get_digit(it) }); 

: 당신 ++ (11)가 활성화 다있는 경우에, 당신은 람다를 사용할 수 있습니다 : 당신은 빈 외부 get_digit를 이동할 수 있습니다

struct get_digit 
{ 
    int operator()(char c) const 
    { 
     return c-'0'; 
    } 
}; 

//... 
std::transform(decd.begin(), decd.end(), decoded.begin(), get_digit()); 
//... 
+1

이것은 멤버 함수를 통해 자유 함수를 가짜로 만드는 가장 어색하고 성가신 방법이다. –

+0

내 컴파일러는이 람다 형식을 허용하지 않는다 :'prog1.c : 멤버 함수 'void'BinaryCode :: decode (std :: string) ': prog1.c : 21 : error : "const"앞에 예상 기본 표현식이 있습니다. ' – kingsmasher1

+0

@KerrekSB 일부 멤버 변수에 액세스해야하기 때문에 멤버 함수를 사용한다고 가정했습니다. –

2

1> :

int get_digit(char c) 
{ 
    return c-'0'; 
} 
class BinaryCode { 
    public: 
    void decode(string decd) 
    { 
     int i; 

     std::vector<int>decoded(decd.size()); 
     std::transform(decd.begin(), decd.end(), decoded.begin(), get_digit); 

     int length=decoded.length(); 
    } 
}; 

또는 펑터를 생성 당신도 향상에 액세스 할 경우 또는 aryCode 다음 코드

2> 일을하거나 원하는 경우 비 정적 멤버 함수로 get_digit 것입니다, 당신은

class BinaryCode { 
    public: 
     int get_digit(char c) 
     { 
       return c-'0'; 
     } 
     void decode(string decd) 
     { 
      int i; 
      std::vector<int>decoded(decd.size()); 
      std::transform(decd.begin(), decd.end(), decoded.begin(), std::bind1st(std::mem_fun(&BinaryCode::get_digit),this)); 
     } 

}; 

3> 물론 사용할 수 있습니다 C++ 11에서는 다른 사람들이 이미 U를 보여 주었기 때문에 쉽게 람다를 사용할 수 있습니다.

+0

매우 유용한 점, 특히 2 번째 점. 하지만 mem_fun을 사용하여 바인드해야하는 이유는 무엇입니까? 'bind1st'를 사용하는 바인딩은 제공되지 않습니다? – kingsmasher1