繁体   English   中英

为什么这段代码试图保存一个函数指针数组会返回一个错误?

[英]Why does this code trying to hold an array of function pointer return an error?

我已经看过这个问题了。 这是我收到的错误消息:
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预期之外的签名,因此,要修复错误,您必须确保作为参数传递给algorithms.push_back()所有函数都完成了预期的签名

例如,如果sortalgorithms::bubble将具有以下签名:

void bubble(int a, int b)
{
    ...
}

向量algorithms应声明为:

std::vector<void (*)(int, int)> algorithms;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM