我一直在研究一些類層次結構,目標是擁有一組封裝原始型別( , 等)的類,AdvancedInt并AdvanceDouble在通過conversion operator和訪問它們的底層值時為它們提供一些額外的行為assignment operator。我不能使用 getter 和 setter 來做到這一點,因為我無法更改原始代碼及其訪問它們的方式,所以我唯一的選擇是運算子多載。
我遇到的問題是定義轉換運算子的模板類,這給了我一個編譯器錯誤。
這是說明問題的代碼
#include <string>
class Base {
public:
Base() = delete;
Base(std::string s) : name(s) {
//Some extra logic
}
~Base() {
//More custom logic
}
virtual std::string get_name() const final { //Final on purpose
return name;
}
private:
const std::string name;
};
template <typename T, class C> class Serializable :public Base { //Poor man's interface (but not quite)
public:
Serializable() = delete;
Serializable(std::string name) : Base(name) {
}
operator T() const {
//Some extra 'getter' logic
return value;
}
C& operator=(const T& val) {
//Some extra 'setter' logic
value = val;
return (C&)*this;
}
virtual void serialize() = 0; //This has to be pure virtual
private:
T value;
};
class AdvancedInt final : public Serializable<int, AdvancedInt> { //This is the actual complete class
public:
AdvancedInt(std::string name) : Serializable(name) {
//Nothing here, but needed for the special constructor logic from AbstractBase
}
void serialize() override {
//Some logic here
}
};
int main()
{
AdvancedInt adv{"foo"};
int calc = adv;
calc = 7;
adv = calc; //error C2679 (msvc) | binary '=': no operator found which takes a right-hand operand of type 'int' (or there is no acceptable conversion)
return 0;
}
現在除了傳遞AdvancedInt給它自己的基類的模板的(可能)有問題的做法,然后它知道它是某個派生類的一部分并實作它的邏輯(盡管對此歡迎任何反饋),我的主要問題是,什么我在這里做錯了嗎?
當C& operator=(const T& val)定義為純虛擬時編譯很好,但這會強制實作在派生類中,并且當在那里實作T并被C其相應的型別替換時它作業得很好,所以簽名在邏輯上是合理的,但可能不正確地方(?)。根據我在cppreference.com上找到的內容,這simple assignment operator是唯一不能在類定義之外定義的賦值運算子。這就是這段代碼無法編譯的原因嗎?如果是這樣,將其宣告為純虛擬是一種方式嗎?
uj5u.com熱心網友回復:
隨著adv = calc我們尋找operator=和AdvancedInt發現(隱式):
AdvancedInt& operator=(const AdvancedInt&);AdvancedInt& operator=(AdvancedInt&&);
并且查找停在那里。
添加:
using Serializable<int, AdvancedInt>::operator=;
將允許考慮超載。
這解決了你的問題。
演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/531477.html
標籤:C 模板遗产运营商
上一篇:創建conststd::vector作為兩個conststd::vector的串聯
下一篇:讓一個類成為函式族的朋友
