C ++'没有匹配函数用于调用'和'没有已知的转换参数'

时间:2015-04-08 18:01:48

标签: c++ explicit-conversion explicit-constructor class-constructors

我有这段代码:

    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);

它也有效。

有没有人可以解释:

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

2 个答案:

答案 0 :(得分:2)

你受到了最令人烦恼的解析。 GlobalPortId port(PortId(i));声明了一个名为port的函数,该函数接受名为PortId的{​​{1}}类型的参数,并返回i。我相信额外的事情会照顾它:GlobalPortId

答案 1 :(得分:0)

您必须使用:

GlobalPortId port = GlobalPortId(PortId(i));