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

标签 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: 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. 为什么不允许在不进行强制转换的情况下使用“port”实例化 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/

相关文章:

c++ - 通过 Rcpp 从 R 调用 QuantLib

c++ - 无效的用户定义转换错误

c++ - operator= 在我的自定义字符串类中不能正常工作

c# - 是否有任何免费的 C++ 和/或 C# 编译器可以在支持 Android 的平板电脑上运行?

java - 在java中显式转换时,short 128 = byte -128如何?

c++ - 要求通过 static_cast<double>(x) 显式调用运算符 double()

C++ 使用 cppcheck 建议的显式

c++ - 为什么显式允许默认构造函数和具有 2 个或更多(非默认)参数的构造函数?

c++ - 在 C++ 中放置新的 VS 显式构造函数调用

c++ - std::forward_list::remove_if 谓词的要求