gpt4 book ai didi

C++ 'no matching function for call to' 和 'no known conversion for argument'

转载 作者:搜寻专家 更新时间:2023-10-31 02:23:15 27 4
gpt4 key购买 nike

我有这段代码:

    class Enum {
public:
const int &value() const {
return value_;
}

bool operator==(const Enum &other) const {
return (other.value() == this->value_);
}

bool operator!=(const Enum &other) const {
return !(*this == other);
}

bool operator<(const Enum& other) const {
return value_ < other.value();
}

protected:
Enum(const int &value) : value_(value) {
}

void set_value(int value) {
value_ = value;
}

private:
int value_;
};

/*
* Port-Id Base classes
*/
class PortIdBase : public Enum {
public:
virtual ~PortIdBase() {}
protected:
PortIdBase(int value) : Enum(value) {}
};

class PortId : public PortIdBase {
public:
PortId(int value) : PortIdBase(value) {}
PortId() : PortIdBase(0) {}
virtual ~PortId() {}
};

class GlobalPortId {
public:
GlobalPortId(const PortIdBase id_base) : base_(id_base) {}
virtual ~GlobalPortId() {}

private:
PortIdBase base_;
};


class CfpDevice {
public:
explicit CfpDevice(int dev_cfp_instance) : instance_(dev_cfp_instance) {}
virtual ~CfpDevice() {}

private:
int instance_;
};

class Cfp {
public:
explicit Cfp(const GlobalPortId &id,
CfpDevice* const device) : id_(id),
device_(device) {}
~Cfp() { delete device_; }

private:
const GlobalPortId id_;
CfpDevice* const device_;
};

int main() {
int number_of_devices = 5;
for(int i = 0; i < number_of_devices; ++i) {
GlobalPortId port(PortId(i));
CfpDevice *cfp_device = new CfpDevice(i);
Cfp *cfp = new Cfp(port, cfp_device);
}
return 0;
}

我不得不更改代码以将所有内容放入一个文件中,因此不必担心与定义和内存分配分开实现。我会修复原始文件中的所有内容。我的问题是为什么编译这段代码我有这条消息:

test.cc: In function ‘int main()’: test.cc:86:40: error: no matching function for call to ‘Cfp::Cfp(GlobalPortId (&)(PortId), CfpDevice*&)’ Cfp cfp = new Cfp(port, cfp_device); ^ test.cc:86:40: note: candidates are: test.cc:70:12: note: Cfp::Cfp(const GlobalPortId&, CfpDevice) explicit Cfp(const GlobalPortId &id, ^ test.cc:70:12: note: no known conversion for argument 1 from ‘GlobalPortId(PortId)’ to ‘const GlobalPortId&’ test.cc:68:7: note: Cfp::Cfp(const Cfp&) class Cfp { ^ test.cc:68:7: note: candidate expects 1 argument, 2 provided

但是如果我改变:

GlobalPortId port(PortId(i));

对于

GlobalPortId port(static_cast<PortIdBase>(PortId(i)));

有效。

如果我删除

GlobalPortId port(PortId(i));

并在 Cfp 创建中实例化:

Cfp *cfp = new Cfp(GlobalPortId(PortId(i)), cfp_device);

它也有效。

有没有人可以解释一下:

  1. 为什么允许实例化 Cfp,在同一行调用 GlobalPortId 和 PortId 构造函数?但当您单独实例化它们时,不允许使用它们。
  2. 为什么不允许在没有转换的情况下使用“端口”实例化 Cfp?

最佳答案

您遇到了最令人烦恼的解析。 GlobalPortId port(PortId(i)); 声明了一个名为 port 的函数,该函数采用名为 iPortId 类型的参数> 并返回一个 GlobalPortId。我相信额外的括号会处理它:GlobalPortId port((PortId(i)));

关于C++ 'no matching function for call to' 和 'no known conversion for argument',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29522059/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com