【问题标题】:"Cannot convert" issue with Member Function Pointers成员函数指针的“无法转换”问题
【发布时间】:2013-07-18 05:21:20
【问题描述】:

我正在尝试制作一个简单的程序,该程序将使用 for_each 和成员函数指针,以便根据元素的位置添加到向量中的每个元素(代码中的 cmets 应该很好地解释它)。

但是,我遇到了一个错误,我不知道如何纠正我所犯的错误(该错误在下面的 cmets 中也有详细说明)。

任何帮助将不胜感激,谢谢。


ma​​in.cpp

#include <iostream>
#include <vector>
#include <list>
#include <algorithm>

class myClass
{
public:
  myClass()      : i_(0) {}
  myClass(int i) : i_(i) {}

  const int& Get() const   {return i_;}
  void Add(const int &arg) {i_ += arg;}

private:
  int i_;
};

template <typename RetType, typename ClassType, typename ArgType>
class MemFuncPointer
{
public:
  MemFuncPointer(RetType (ClassType::*_pointer) ()) : pointer(_pointer) {}
  RetType operator() (ClassType &element) {return(element.*pointer) ();}

private:
  RetType (ClassType::*pointer) (ArgType);
};

template <typename RetType, typename ClassType, typename ArgType>
MemFuncPointer<RetType, ClassType, ArgType> func(RetType (ClassType::*pointer) (ArgType) )
{
  return MemFuncPointer<RetType, ClassType, ArgType>(pointer);
  // The above line gets...
  // error C2440: '<function-style-cast>' : cannot convert from
  // 'void (__thiscall myClass::* ) (const int &)' to
  // 'Functor<RetType,ClassType,ArgType>'
}

int main(void)
{
  // Create Vector v
  std::vector<myClass> v;

  // Push back ten 10's
  for(int i = 0; i < 10; ++i)
    v.push_back( myClass(10) );

  // Set two iterators
  std::vector<myClass>::const_iterator it = v.begin(), it_end = v.end();

  // Print the vector and newline
  for(; it != it_end; ++it)
    std::cout << it->Get() << " ";
  std::cout << "\n";

  // for_each
  std::for_each(v.begin(), v.end(), func(&myClass::Add));

  // Print the vector and newline
  for(it=v.begin(); it!=it_end; ++it)
    std::cout << it->Get() << " ";
  std::cout << "\n";

  // Final vector should be 
  10, 11, 12, 13, 14, 15, 16, 17, 18, 19
}

【问题讨论】:

  • std::for_each 需要一个一元函子,在这种情况下采用 myClass。成员函数接受this 的第一个隐式参数,因此它不是一元函数。您需要将myClass 实例绑定到它,或使用std::mem_fn。但请注意,myClass::Add 需要一个 int,而您将传递给它一个 myClass。您需要一个采用myClassAdd 方法。
  • 如果可以使用std::function,则不需要自定义包装函数指针。

标签: c++ function templates pointers member


【解决方案1】:

你传入的函数指针因参数类型不同而不同。

在下一行中,Add 函数采用一个参数。

void Add(const int &arg) {i_ += arg;}

但是MemFuncPointer 没有参数:

MemFuncPointer(RetType (ClassType::*_pointer) ()) : pointer(_pointer) {}

这就是你得到编译错误的原因。


要实现您的逻辑,您不能使用for_each,因为for_each 不会将元素位置传递给函子。

你可以这样改正:

  1. 修复类型错误。

    MemFuncPointer(RetType (ClassType::*_pointer) ()) : pointer(_pointer) {}
    RetType operator() (ClassType &element) {return(element.*pointer) ();}
    

    ---->

    MemFuncPointer(RetType (ClassType::*_pointer) (ArgType)) : pointer(_pointer) {}
    RetType operator() (ClassType &element, int i) {return(element.*pointer) (i);}
    
  2. 写下你的for_each

    std::for_each(v.begin(), v.end(), func(&myClass::Add)); 
    

    ---->

    for (int i = 0; i < v.size(); i++)
    {
          func(&myClass::Add)(v[i], i);
    }
    

但我仍然认为您不需要如此复杂的代码来完成这项工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多