候选构造函数(隐式复制构造函数)无效:第一个参数需要一个l值

问题

我有一个Deck类,它是52个Card对象的容器。Deck是从另一个名为CardCollection的类派生的(因为我想在其他地方使用类似的纸牌组,但不是全部纸牌)。我的问题是我可以使用

创建Deck对象
Deck deck();

但当我使用

Deck deck = Deck();

Clang-tidy(Clion)抱怨Candidate constructor (the implicit copy constructor) not viable: expects an l-value for 1st argument。我的理解是(基于this问题)这两种实例化方式基本相同,但由于其中一种会导致警告

代码

我只粘贴这些类声明的构造函数,以防止出现这个问题。

//Card.h

    class Card {
    public:
        int rank; 
        basic_string<char> suit;

        Card(int r, std::string s); // rank and suit

        ~Card();

    //...
}

// CardCollection.h
#include <vector>
#include "Card.h"


class CardCollection {

protected:
    vector<Game::Card> _cards;
public:
    CardCollection();
     ~CardCollection();
     CardCollection(CardCollection &other);
     explicit CardCollection(int n);
     explicit CardCollection(vector<Game::Card> &cards);
    //...

// Deck.h

#include "Card.h"
#include <vector>
#include "CardCollection.h"

class Deck : public CardCollection {
public:
    Deck();
    ~Deck();
    explicit Deck(vector<Game::Card> &cards);
    Deck * shuffle();
    //...
};



解决方案

对于初学者来说

Deck deck();

是没有参数且返回类型为Deck的函数声明。

其次是类CardCollection的复制构造函数

CardCollection(CardCollection &other);

无法将非常数引用绑定到临时对象。

按如下方式声明

CardCollection( const CardCollection &other);

相关文章