如何解决为什么此代码试图保存函数指针数组,但返回错误?
我已经看过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)尝试添加其他指针类型
- 当您将指针作为参数传递时,该指针必须引用内存中的实际对象,在您的情况下,
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
所期望的签名,因此,要修复错误,必须确保将作为参数传递给{{ 1}}完成预期的签名
例如,如果algorithms.push_back()
具有以下签名:
sortalgorithms::bubble
向量void bubble(int a,int b)
{
...
}
应声明为:
algorithms
您可以使用这三种情况的任意组合,无论哪种情况都适用
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。