【问题标题】:No matching function for call to C++ constructor [closed]没有用于调用 C++ 构造函数的匹配函数 [关闭]
【发布时间】:2021-08-06 17:20:47
【问题描述】:

我看到很多类似的帖子,例如this one,但没有一个能解决我的问题。

我有 2 个班级,CacheReader

Cache.hpp

class Cache {
public:
    explicit Cache(unsigned int max_files);

private:
    size_t max_size;

Cache.cpp

Cache::Cache(unsigned int max_files): max_files(max_files) {}

Reader.hpp

class Reader{
public:
    Reader(unsigned int num_files = 4);

private:
    mutable Cache my_cache;

Reader.cpp

Reader::Reader(unsigned int num_files){
    if (num_files > 10){
        num_files = 10;
    }
    my_cache(num_files);
}

在编译时,我得到这个错误:

In constructor ‘Reader::Reader(unsigned int)’: error: no matching function for call to ‘Cache::Cache()’
   16 | Reader::Reader(unsigned int num_files) {
        note: candidate: ‘Cache::Cache(unsigned int)’
   26 |         explicit Cache(unsigned int max_files);

【问题讨论】:

  • 您的成员初始化语法错误​​。应该是Reader::Reader(unsigned int num_files) : my_cache(num_files) { }
  • 更改阅读器::Reader(unsigned int num_files){ my_cache(num_files); } to Reader::Reader(unsigned int num_files) : my_cache(num_files){ } 原因是您需要初始化 Cache,但在创建 Reader 类之前需要它,因为您没有默认构造函数(即缓存())。
  • 那不是像做my_cache = num_files,而不是调用Cache 构造函数吗?
  • @DanielCJacobs 您在问题中链接到的答案——您为什么不尝试接受的答案?那会解决你的问题。
  • @PaulMcKenzie 哦,看来我只是没有正确理解成员初始化的工作原理;因此我之前的评论

标签: c++ class


【解决方案1】:

my_cache(num_files); 在构造函数Reader::Reader 试图调用my_cache(作为函子),参数为num_files;它不会在my_cache 上执行初始化。相反,在进入构造函数的主体之前,my_cache 将首先被默认初始化,但Cache 没有默认构造函数。

你应该在成员初始化列表中将my_cache初始化为

Reader::Reader(unsigned int num_files) : my_cache(num_files) { // initialize my_cache by Cache::Cache(unsigned int)
}

编辑

对于构造函数,

Reader::Reader(unsigned int num_files){
    if (num_files > 10){
        num_files = 10;
    }
    my_cache(num_files);
}

看来你想在构造函数体中初始化my_cache,但是initialization order是固定的:

...

  1. 然后,按照类定义中的声明顺序初始化非静态数据成员。

  2. 最后,构造函数的主体被执行

这意味着my_cache必须在进入构造函数体之前被初始化。

您可以创建一个辅助函数来计算大小,然后使用它来初始化成员初始化列表中的my_cache

【讨论】:

  • 这个问题应该作为拼写错误关闭,不需要答案。
  • @SergeyA @songyuanyao 请重新打开。我更新了Reader 构造函数来说明为什么我没有使用成员初始化。
  • @DanielCJacobs 您仍然无法按照您的方式做您需要做的事情。您可以在构造函数中初始化成员的唯一位置是成员初始化程序列表。其他一切都是任务或错误。您可以使用辅助函数修改num_filesstd::min 看起来不错,在初始化列表中。例如:: my_cache(std::min(num_files,10))
  • @DanielCJacobs 答案已修改。
猜你喜欢
  • 2013-07-23
  • 2020-01-22
  • 1970-01-01
  • 2015-09-21
  • 1970-01-01
  • 1970-01-01
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多