[英]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) 尝试添加不同的指针类型
sortalgorithms::bubble
不是有效引用,因为它尚不存在于内存中,它只是一个声明。 要解决这个问题,你需要先有一个sortalgorithms
的实例,然后传递bubble
函数的引用,如下所示:sortalgorithms algorithms;
algorithms.push_back(algorithms.bubble);
或者
auto algorithms = new sortalgorithms();
algorithms.push_back(algorithms->bubble);
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;
};
编辑
虽然原始答案可能适用,但它不包括其他可能的情况
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.