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

Candidate constructor (the implicit copy constructor) not viable: expects an l-value for 1st argument

本文关键字:构造函数 参数 第一个 不可行 复制 候选      更新时间:2023-10-16

问题

我有一个Deck类,它是 52 个Card对象的容器。Deck派生自另一个名为CardCollection的类(因为我希望在其他地方有类似的卡片组,而不是一副完整的卡片(。我的问题是我可以创建一个Deck对象

Deck deck();

但是当我使用

Deck deck = Deck();

叮叮当当(在CLion中(抱怨Candidate constructor (the implicit copy constructor) not viable: expects an l-value for 1st argument.我的理解(基于这个问题是这两种实例化方式基本相同,但由于一种会引起警告

《守则》

我只会粘贴这些类声明的构造函数,以防止这成为"墙-o-text"问题。

//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);