我有这段代码:
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:在函数'int main()'中: test.cc:86:40:错误:没有匹配函数来调用'Cfp :: Cfp(GlobalPortId(&amp;)(PortId),CfpDevice *&amp;)' Cfp cfp = new Cfp(port,cfp_device); ^ test.cc:86:40:注意:候选人是: test.cc:70:12:注意:Cfp :: Cfp(const GlobalPortId&amp;,CfpDevice ) 显式Cfp(const GlobalPortId&amp; id, ^ test.cc:70:12:注意:参数1从'GlobalPortId(PortId)'到'const GlobalPortId&amp;'没有已知的转换 test.cc:68:7:注意:Cfp :: Cfp(const Cfp&amp;) class Cfp { ^ test.cc:68:7:注意:候选人需要1个参数,2个提供
但是,如果我改变:
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);
它也有效。
有没有人可以解释:
答案 0 :(得分:2)
你受到了最令人烦恼的解析。 GlobalPortId port(PortId(i));
声明了一个名为port
的函数,该函数接受名为PortId
的{{1}}类型的参数,并返回i
。我相信额外的事情会照顾它:GlobalPortId
答案 1 :(得分:0)
您必须使用:
GlobalPortId port = GlobalPortId(PortId(i));