C ++ - 候选函数不可行:没有已知的从'struct'到'struct(&)'的转换

时间:2018-04-27 19:47:41

标签: c++ arrays function struct compiler-errors

首先,我是一个完整的C ++新手。我试图用一些结构数组(包括一个2D)调用一个函数作为参数,我得到以下错误:

  

没有用于调用'function'的匹配函数:候选函数不可行:没有已知的'struct _psoParticle [particleQnty] [2]'转换为'_psoParticle(&)[] [2]'作为第一个参数

我的结构(让我们假设材料= 1,期间= 10):

struct unit{
    int inventory[material][period];
    int consumption[material][period];
    int replenishment[material][period];
    int planned[material][period];
    int accPlanned[material][period];
    int demandPull[material][period];
    int costPenalty[material][period];
    bool delivery[material][period];
    int leadtime;
    int inventoryControl[material][period];
    double bufferSize[material][period];
    double bufferLevel[material][period];
    double bufferMgmt[material][period];
    const double lbGamma{-100.0};
    const double ubGamma{100.0};
};

struct _psoParticle{
    double positionBest;
    double velocityBest;
    long pbest;
};

在main中初始化数据:

struct unit CareUnit[2]{};
struct unit centralStore{};
struct _psoParticle psoParticle_CareUnit[10][2];
struct _psoParticle psoParticle_CentralStore[10];
int totalConsumption[material]{}, totalInventory{}, totalLateness{};
int particleQnty{10};
int x[particleQnty]{};

功能标题:

int dbr(_psoParticle (&pso_CareUnit)[][2], _psoParticle (&pso_CentralStore)[],
            int particle, unit (&CareUnit)[], unit &centralStore,
            int (&totalConsumption)[1], int &totalInventory, int &totalLateness);

继续主要:

for (int i = 0; i < particleQnty; ++i)
    x[i] = dbr(psoParticle_CareUnit, psoParticle_CentralStore, i, CareUnit,
           centralStore, totalConsumption, totalInventory, totalLateness);

然后弹出错误消息。

关于我做错了什么想法?

谢谢!

1 个答案:

答案 0 :(得分:0)

啊,是的,我知道这个......好吧,你的功能应该是这样的

int dbr(_psoParticle (&pso_CareUnit)[10][2], _psoParticle (&pso_CentralStore)[10],
        int particle, unit (&CareUnit)[2], unit &centralStore,
        int (&totalConsumption)[material], int &totalInventory, int &totalLateness);

请注意,每个参数都指定了完整的尺寸。现在的原因是你的所有数组都是静态数组,所以编译器必须在运行你的程序之前从头开始知道它。因此它可以做sizeof(arr)for(T obj: arr){}等花哨的花哨和哨声。

现在你可能已经注意到,这种做事方式是一团糟。你有一些选择可以让它变得更好。最简单的努力就是用模板替换你的参数类型。像

template<typename T1, typename T2, etc...
int dbr(T1 &pso_CareUnit, T2 & pso_CentralStore...

然后编译器会弄清楚你自己到底是怎么回事。你也可以将em作为指针传递,然后一些信息会丢失,你不得不以某种方式传递维度,但无论如何......

int dbr(_psoParticle ** pso_CareUnit, _psoParticle *pso_CentralStore,...

你也可以使用像std :: vector

这样的stl类型
int dbr(std::vector<std::vector<_psoParticle>>& pso_CareUnit, std::vector<_psoParticle>& pso_CentralStore,...

你也可以封装整个事情,如

struct Container{
_psoParticle careUnit[10][2];
_psoParticle centralStore[10];
};

int dbr(Container & iContainer...

甚至更好

class Pso{
public:
    int dbr(...
private:
    _psoParticle careUnit[10][2];
    _psoParticle centralStore[10];
    // ... the rest of arguments
};

还有一些更时髦的方法来处理它,比如迭代器和诸如此类的东西。但在你的情况下,我认为一个简单的指针解决方案或封装就足够了。虽然我将来警告你不要使用C风格的结构和数组,但它们很难处理,并且有各种各样的STL容器。你的命名惯例是非常奇怪的,请查看Google或GNU C ++指南以获取样式提示。