C ++ «нет подходящей функции для вызова» и «нет известного преобразования для аргумента»

У меня есть этот кусок кода:

    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: ошибка: нет соответствующей функции для вызова call Cfp :: Cfp (GlobalPortId (&) (PortId), CfpDevice *&)»
CFP cfp = новый Cfp (порт, cfp_device);
^
test.cc:86:40: примечание: кандидаты:
test.cc:70:12: note: Cfp :: Cfp (const GlobalPortId&, CfpDevice
)
явный Cfp (const GlobalPortId &Я бы,
^
test.cc:70:12: примечание: нет известного преобразования для аргумента 1 из «GlobalPortId (PortId)» в «const GlobalPortId»&»
test.cc:68:7: примечание: Cfp :: Cfp (const Cfp&)
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);

Это тоже работает.

Есть ли кто-нибудь, кто мог бы объяснить:

  1. Почему разрешено создавать Cfp, вызывая конструкторы GlobalPortId и PortId в одной строке? Но их нельзя использовать, когда вы создаете их отдельно.
  2. Почему не разрешается создавать Cfp с использованием ‘port’ без приведения?

2

Решение

Вы были поражены самым неприятным разбором. GlobalPortId port(PortId(i)); объявляет функцию с именем port который принимает параметр типа PortId названный i и возвращает GlobalPortId, Я верю, что дополнительные параны позаботятся об этом: GlobalPortId port((PortId(i)));

2

Другие решения

Вы должны использовать:

GlobalPortId port = GlobalPortId(PortId(i));
0

По вопросам рекламы [email protected]