class Base {
public:
virtual void load() = 0;
};
template<typename T>
class CustomConfig : public Base {
public:
const T& getData() { return data; }
T data;
};
template<>
class CustomConfig<std::set<uint32_t>> {
public:
virtual void load() {
this->data = {4, 5, 6};
}
};
我不知道為什么我收到錯誤:
class CustomConfig<std::set<unsigned int> >' has no member named 'data'
真實案例
事實上,我得到了這樣一個問題:我需要一個虛函式,但它的回傳型別是不是唯一的,它可能是一個std::set,一個std::vector,std::list或一些其他型別。然后我在想模板技術可能會有所幫助。這就是我定義 class 的原因template<typename T> class CustomConfig。
我希望這不是一個嚴重的 XY 問題......顯然我誤解了模板類的作業原理。
uj5u.com熱心網友回復:
為了提供其他答案的替代方案,這些答案都說您必須添加您的資料成員,還有另一種選擇是從模板實體化派生而來:
class CustomConfigSetOfUInt : public CustomConfig<std::set<uint32_t>> {
public:
void load() override {
this->data = {4, 5, 6};
}
};
如果您CustomConfig提供了可以從在類模板中完成的其他通用功能,那么您可能更喜歡這種方法。您的設計總體上有點不舒服,并且無論哪種方式似乎都對封裝持“輕松”的態度。你可能想更深入地思考一下。
uj5u.com熱心網友回復:
特化是一個全新的類(相對于主模板),你也必須為它宣告資料成員(也是繼承的)。例如
template<>
class CustomConfig<std::set<uint32_t>> : public Base {
public:
virtual void load() {
this->data = {4, 5, 6};
}
const std::set<uint32_t>& getData() { return data; }
std::set<uint32_t> data;
};
uj5u.com熱心網友回復:
CustomConfig<std::set<uint32_t>>是專業化的CustomConfig<T>,也就是說,它取代 CustomConfig<T>的時候T是std::set<uint32_t>,它并沒有獲得來自CustomConfig<T>像你所想。因此,它不繼承 的任何成員CustomConfig<T>。
這兩個是完全不同的類。
uj5u.com熱心網友回復:
該特化不繼承自模板類,而是用于代替特定資料型別的模板類。
所以它沒有data或load(),你必須自己提供它們,例如:
template<>
class CustomConfig<std::set<uint32_t>> : public Base {
public:
virtual void load() {
this->data = {4, 5, 6};
}
const std::set<uint32_t> &getData() { return data; }
std::set<uint32_t> data;
};
在任何情況下,避開更“通用”的底層型別通常是一個好主意,因為這可以極大地幫助發現和修復問題。我的意思是像型別定義那樣使事情更清楚:
using ConfigIntSet = std::set<uint32_t>; // Use *specific* type.
template<>
class CustomConfig<ConfigIntSet> : public Base {
public:
virtual void load() {
this->data = {4, 5, 6};
}
ConfigIntSet data;
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/380294.html
