微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么此代码试图保存函数指针数组,但返回错误?

如何解决为什么此代码试图保存函数指针数组,但返回错误?

我已经看过this问题。这是我收到的错误消息:
E0304 no instance of overloaded function "std::vector<_Ty,_Alloc>::push_back [with _Ty=void (*)(),_Alloc=std::allocator<void (*)()>]" matches the argument list

我的目标是让所有指针都在向量中起作用,因此我可以通过测试不同的排序算法来遍历各种数据集的指针 我的代码

    #include <iostream>
    #include <fstream>
    #include <chrono>
    using namespace std;
    #ifndef Sort_h
    #define Sort_h

    class Sort : public Algorithm
    {
    public:
        Sort() {
            algorithms.push_back((sortalgorithms::bubble));
            //algorithms.push_back(&(sortalgorithms::merge));
            //algorithms.push_back(&(sortalgorithms::insertion));
        }
        ~Sort();
        void load(string);
        void execute();
        void display();
        void stats();
        void select(int);
        void save();
        void configure();
    
    private:
        int type = 0;
        vector<int> data;
        string sortname;
        int vecSize = 0;
        string fileName;
        chrono::duration<double> time;
        std::vector<void (*)()> algorithms;
    };
    
    #endif
    #pragma once
    #include "Algorithm.h"
    #include <string>
    #ifndef algorithm_h
    #define algorithm_h
    using namespace std;
    class Algorithm {
    public:
        Algorithm() {};
        virtual ~Algorithm() {};
        virtual void load(string) = 0;
        virtual void execute() = 0;
        virtual void display() = 0;
        virtual void stats() = 0;
        virtual void select() = 0;
        virtual void save() = 0;
        virtual void configure() = 0;
    };
    
    #endif algorithm_h

我想从函数指针的向量中调用函数

解决方法

这里似乎有两个错误:1)尝试添加无效的函数引用,以及2)尝试添加其他指针类型

  1. 当您将指针作为参数传递时,该指针必须引用内存中的实际对象,在您的情况下,sortalgorithms::bubble不是有效的引用,因为它在内存中尚不存在,它只是一个声明。要解决此问题,您需要首先拥有sortalgorithms的实例,然后传递bubble函数的引用,如下所示:
sortalgorithms algorithms;
algorithms.push_back(algorithms.bubble);

auto algorithms = new sortalgorithms();
algorithms.push_back(algorithms->bubble);
  1. 即使bubble的签名为 void sortalgorithms::bubble () ,这也不符合要求在向量中输入void (*)(),因此,由于您正在使用属于类sortalgorithms的函数,因此必须将向量声明为std::vector<void (sortalgorithms::*)()> algorithms

放在一起:

class Sort
{
public:
    Sort()
    {
        algorithms.push_back(sortfunctions.bubble);
    }
    ...
private:
    ...
    std::vector<void (sortalgorithms::*)()> algorithms;
    sortalgorithms sortfunctions;
};

修改

尽管原始答案可能适用,但不包括其他可能的情况

  1. 根据错误消息,sortalgorithms::bubble函数的签名不同于向量algorithms所期望的签名,因此,要修复错误,必须确保将作为参数传递给{{ 1}}完成预期的签名

例如,如果algorithms.push_back()具有以下签名:

sortalgorithms::bubble

向量void bubble(int a,int b) { ... } 应声明为:

algorithms

您可以使用这三种情况的任意组合,无论哪种情况都适用

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。