C++在使用转换(STL)时出错

C++ error in using transform (STL)

本文关键字:STL 出错 转换 C++      更新时间:2023-10-16

我在使用transform:时遇到编译错误

这与我之前的问题有关: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++)编译器。

最好的IMHO是更改的定义

        int get_digit(char c)

        static int get_digit(char c)

它应该与此(静态函数)一起工作。可以使用成员函数进行转换,但稍微复杂一些。此外,您不需要它。

您需要传递一个函数或函子作为最后一个参数,而不是成员函数。如果您启用了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());
//...

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,那么您可以像其他人已经展示的那样轻松地使用lambda。