簡體   English   中英

C++ 橫向協變:由於類型不完整,返回類型不同

[英]c++ crosswise covariant: return type differs due to incomplete type

我正在試驗協方差並提出以下示例,該示例至少不能使用 clang 11 和 VS2015 進行編譯:

class Number {
public:
    virtual ~Number () = default;
    virtual Number const * increment()const = 0;
};

class Even;

class Odd : public Number {
public:
    // error: increment() is not covariant because Even is incomplete
    Even const * increment()const; 
};

class Even : public Number {
public:
    Odd const * increment()const;
};

它與協變返回類型、常量性和不完整類有關,但不是重復的,因為在兩個被覆蓋的函數中常量性是相同的。

這甚至得到標准的支持嗎?

有沒有辦法解決這個問題或任何建議來實現類似的行為?

雖然可能有您想要實現的解決方法,但顯示的代碼無效。

根據class.virtual#9

如果 D :: f 的協變返回類型中的類類型與 B :: f 的不同,則 D :: f 的返回類型中的類類型應在聲明點完成D :: f or 應該是類類型 D. ...

鏈接文本中有此規則的示例。

在您的情況下,由於Odd::increment的返回類型不是Number ,並且Even在聲明Odd::increment不完整,因此代碼格式錯誤。

我在這個不正確的答案中找到了答案,因此刪除了@Brian 針對您鏈接到的問題所寫的答案

您可以使用非虛擬界面實現類似的功能(盡管它有更多行並且似乎更容易搞砸):

class Number {
public:
    virtual ~Number() = default;
    Number const * increment() const { return do_increment(); }
private:
    virtual Number const * do_increment() const = 0;
};

class Even;

class Odd : public Number {
public:
    Even const * increment() const;
private:
    Number const * do_increment() const override;
};

class Even : public Number {
public:
    Odd const * increment() const { return do_increment(); }
private:
    Odd const * do_increment() const override;
};

inline Even const * Odd::increment() const {
    return static_cast<Even const *>(do_increment());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM