Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ &引用;无法转换";成员函数指针问题_C++_Function_Templates_Pointers_Member - Fatal编程技术网

C++ &引用;无法转换";成员函数指针问题

C++ &引用;无法转换";成员函数指针问题,c++,function,templates,pointers,member,C++,Function,Templates,Pointers,Member,我正在尝试制作一个简单的程序,用于_each和一个成员函数指针,以便根据元素的位置向向量中的每个元素添加元素(代码中的注释应该能够很好地解释它) 然而,我遇到了一个错误,我不知道如何纠正我所犯的错误(错误也在下面的评论中详细说明) 任何帮助都将不胜感激,谢谢 main.cpp #include <iostream> #include <vector> #include <list> #include <algorithm> class myCl

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

然而,我遇到了一个错误,我不知道如何纠正我所犯的错误(错误也在下面的评论中详细说明)

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


main.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
}
#包括
#包括
#包括
#包括
类myClass
{
公众:
myClass():i_u0{}
myClass(int i):i_Ui(i){}
const int&Get()const{return i}
void Add(const int&arg){i_+=arg;}
私人:
国际组织;
};
模板
类MemFuncPointer
{
公众:
MemFuncPointer(RetType(ClassType::*_-pointer)():指针(_-pointer){}
RetType运算符()(类类型和元素){return(元素。*指针)(;}
私人:
RetType(类类型::*指针)(ArgType);
};
模板
MemFuncPointer func(RetType(类类型::*指针)(ArgType))
{
返回MemFuncPointer(指针);
//上面这行是。。。
//错误C2440:'':无法从转换
//'void(uu thiscall myClass::*)(const int&)'到
//“函子”
}
内部主(空)
{
//创建向量v
std::向量v;
//向后推10秒
对于(int i=0;i<10;++i)
v、 推回(myClass(10));
//设置两个迭代器
std::vector::const_迭代器it=v.begin(),it_end=v.end();
//打印向量和换行符
for(;it!=it_end;++it)

std::cout Get()传递的函数指针因其参数类型不同而不同

在下一行中,
Add
函数接受一个参数

void Add(const int &arg) {i_ += arg;}
但是
MemFuncPointer
不接受任何参数:

MemFuncPointer(RetType (ClassType::*_pointer) ()) : pointer(_pointer) {}
这就是为什么会出现编译错误


为了实现您的逻辑,您不能对每个_使用
,因为每个_的
不会将元素位置传递给函子

您可以通过以下方式进行更正:

  • 修复类型错误

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

  • 为每个_编写您的
    版本

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

    for(int i=0;i

  • 但是我仍然不认为你需要这么复杂的代码来完成这项工作。

    std::for_每个
    都需要一个一元函子,在这种情况下使用一个
    myClass
    。成员函数为
    this
    获取第一个隐式参数,因此它不是一元函数。你需要将
    myClass
    实例绑定到它,或者使用。但是请注意,
    myClass::Add
    需要一个
    int
    ,您将向它传递一个
    myClass
    。您需要一个
    Add
    方法,采用
    myClass
    。如果您可以使用
    std::function
    ,则不需要自定义包装函数指针。
    std::for_each(v.begin(), v.end(), func(&myClass::Add)); 
    
    for (int i = 0; i < v.size(); i++)
    {
          func(&myClass::Add)(v[i], i);
    }