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

Posted

技术标签:

【中文标题】C++\'没有匹配的调用函数\'和\'没有已知的参数转换\'【英文标题】:C++ 'no matching function for call to' and 'no known conversion for argument'C++'没有匹配的调用函数'和'没有已知的参数转换' 【发布时间】:2015-06-13 20:21:49 【问题描述】:

我有这段代码:

    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 (&)(PortId), CfpDevice*&)’ Cfp cfp = new Cfp(port, cfp_device); ^ test.cc:86:40: 注意:候选人是: test.cc:70:12:注意:Cfp::Cfp(const GlobalPortId&, CfpDevice) 显式 Cfp(const GlobalPortId &id, ^ test.cc:70:12:注意:没有已知的参数 1 从“GlobalPortId(PortId)”到“const GlobalPortId&”的转换 test.cc:68:7:注意:Cfp::Cfp(const Cfp&) 类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);

它也有效。

有没有人可以解释一下:

    为什么允许实例化 Cfp,在同一行调用 GlobalPortId 和 PortId 构造函数?但是单独实例化时是不允许使用的。 为什么不允许使用不强制转换的“端口”实例化 Cfp?

【问题讨论】:

【参考方案1】:

你被最令人烦恼的解析击中了。 GlobalPortId port(PortId(i)); 声明了一个名为port 的函数,该函数接受一个名为iPortId 类型的参数并返回一个GlobalPortId。我相信额外的括号会处理它:GlobalPortId port((PortId(i)));

【讨论】:

你是对的。额外的括号可以解决问题。我发现 C++11 允许这种带有大括号的构造来避免这个解析问题。 GlobalPortId 端口 PortId(i) ;【参考方案2】:

你必须使用:

GlobalPortId port = GlobalPortId(PortId(i));

【讨论】:

试着进一步解释你的答案。

以上是关于C++'没有匹配的调用函数'和'没有已知的参数转换'的主要内容,如果未能解决你的问题,请参考以下文章

PL/PgSQL:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换

当只需要 2 个参数时,没有匹配的函数来调用 6 个参数

c++ 错误:没有匹配的函数用于从函数内调用“getline”,但在 main 中有效

C++中函数模板和模板函数的区别

C ++没有匹配函数来调用向量中的擦除

没有匹配的成员函数调用“擦除”