错误:调用复制构造函数 C++ 没有匹配函数

error: no matching function for call to copy constructor, c++

提问人:JohnZ 提问时间:5/15/2023 最后编辑:463035818_is_not_an_aiJohnZ 更新时间:5/15/2023 访问量:115

问:

提前对不起,这可能是一个糟糕的帖子。我已经在stackoverflow中搜索了回答我问题的预先存在的帖子,但是尽管这里的许多帖子都是相似的,但它们似乎都不适用于我的情况。 我有struct Node,被设计成一个容器。类角色,具有角色的名称和能力。 由于某种原因,如果没有默认构造函数,代码崩溃并出现错误:

enter image description here

#include <sstream>
#include <string>
#include <vector>
#include <iostream>
class Characters {
    public:
        int power;
        std::string name;
        Characters(int power, const std::string &name) : power(power), name(name) {}
        // Characters() : power(0), name("") {}
        //without above line, the code crashes with error: no matching function for call to 'Characters::Characters()' 39 |     Node (const Node<T> &other) {

        Characters(const Characters &other) {
            power=other.power;
            name = other.name;
        }

};

template <typename T>
struct Node {
    T val;
    Node (const T &val) : val(val) {}
    Node (const Node<T> &other) {
        val= other.val;
    }
};

int main() {
    using namespace std;
    Node<Characters> n1(Characters(4, "meh"));
    Node<Characters> n2=n1;

    return 0;
}

我不知道为什么在没有默认构造函数的情况下会发生这种情况。我可能只是不擅长使用谷歌,但我搜索的东西似乎都没有解决我的问题。

任何帮助将不胜感激。谢谢!

C++ 复制 深拷贝 默认构造函数

评论

1赞 463035818_is_not_an_ai 5/15/2023
为什么我不应该上传代码/数据/错误的图片?
2赞 463035818_is_not_an_ai 5/15/2023
您正在为一个构造函数使用成员初始值设定项列表,为什么不为另一个构造函数使用?成员在执行构造函数的主体之前初始化,在没有初始化程序的情况下,必须调用默认构造函数,但没有初始化函数。Character
1赞 463035818_is_not_an_ai 5/15/2023
: val(val)是成员初始值设定项列表。正如你在这里看到的 godbolt.org/z/bY74Y1Pos 当你使用它时,错误就会消失
1赞 463035818_is_not_an_ai 5/15/2023
不,它不一样。成员在执行构造函数的主体之前初始化。提供初始值设定项的一种方法是通过成员初始值设定项列表。en.cppreference.com/w/cpp/language/constructor
1赞 463035818_is_not_an_ai 5/15/2023
不用担心。我认为这是“初学者意识”与重要性商数;)最差的一个细节。我想一个人必须至少卡住一次才能理解它。顺便说一句,我已经浪费了我的选票,但也许其他人会好心地找到重复的问题

答:

1赞 JohnZ 5/15/2023 #1

感谢463035818_is_not_a_number指出了这一点!

如下:

Node (const Node<T> &other) {
    val= other.val;
}

应该用这个代替。

Node (const Node &other) : val(other.val) {        }

我误解了成员初始化列表的用法和属性。