[英]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
不完整,因此代碼格式錯誤。
您可以使用非虛擬界面實現類似的功能(盡管它有更多行並且似乎更容易搞砸):
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.