Ошибка C ++ при использовании преобразования (STL) - PullRequest
0 голосов
/ 20 января 2012

Я сталкиваюсь с ошибкой компиляции при использовании преобразования:

Это связано с моим предыдущим вопросом: C ++: Как скопировать строковый объект в массив int? )

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

[root@localhost 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 ++).

Ответы [ 3 ]

7 голосов
/ 20 января 2012

Лучшим ИМХО было бы изменить определение

        int get_digit(char c)

на

        static int get_digit(char c)

. Это должно работать с этим (статическая функция).Можно преобразовать, используя функции-члены, но это немного сложнее.Более того, вам это не нужно.

2 голосов
/ 20 января 2012

1> Вы можете переместить get_digit за пределы BinaryCode, тогда ваш код будет работать

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> Конечно, если у вас есть доступ к boost или c ++ 11, вы можете легко использовать лямбду, как уже показывали другие.

2 голосов
/ 20 января 2012

Вам нужно передать функцию или функтор как последний параметр, а не функцию-член.Если у вас включен c ++ 11, вы можете использовать lambda:

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

Поскольку у вас нет функций c ++ 11, вы можете преобразовать get_digit в функцию (вне класса):

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();
    }
};

или создать функтор:

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

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