下一個代碼工作正常(這是我的另一個問題的過於簡化版本,類型更長,更深,更模板):獲取模板基類的類型
template<class C>
struct Base
{};
template<class C>
struct Derived : public Base<C>
{
Derived() : Base<C>()
{}
};
但是,我怎麼能打電話沒有「寫」基類的完整類型的基類構造函數?例如,我試過類似的東西:
template<class C>
struct Base
{
typedef Base base_type;
};
template<class C>
struct Derived : public Base<C>
{
Derived() : base_type() {}
};
int main()
{
Derived<void> b;
}
但是「base_type」未被識別。該GCC拋出的消息是:
test3.cpp: In constructor 'Derived<C>::Derived()':
test3.cpp:100:17: error: class 'Derived<C>' does not have any field
named 'base_type'
爲了解決它,我必須寫在構造Base<C>::base_type
,但這會使得base_type
本身的存在無關。
難道我的寫作拯救運動是不可能的嗎?
而且,爲什麼base_type
在構造函數中找不到,然而這工作正常嗎?
int main()
{
Derived<void>::base_type b;
}
編輯:隨着@Jack Aidley的評論,我發現一個簡單的別名來獲得基類的類型,最好的形式是:
template<typename C> struct Base {};
template<typename C, typename Base>
struct Derived_impl : public Base
{
Derived_impl() : Base()
{}
};
template<typename C>
using Derived = Derived_impl<C, Base<C> >;
int main()
{
Derived<void> b;
}
任何你不能做的原因'template struct派生:public Base '? –
這似乎是個好主意。謝謝。 –