我試圖寫template class defining a super
type idiom的變化繼承定義的類型。類Inherit
介紹類型Super
來表示可能是很長的超類型,並且還需要知道派生類型New
做這我不會在這裏呈現出一些額外的東西。C++找不到模板基類,從目前的模板類
這工作正常,如果傳遞給New
類型是不是一個模板,但沒有使用模板。這裏是clang++-3.8 -std=c++1y -Wall
編譯一個完整的例子(GCC給出了相同的輸出):
struct SomeBase {};
template<class New, class Base>
struct Inherit : Base {
using Super = Inherit<New, Base>;
};
struct NonTemplate : Inherit<NonTemplate, SomeBase> {
using X = Super;
// compiles and is nice and short
};
template<class T>
struct Template : Inherit<Template<T>, SomeBase>
{
using A = Super;
// error: unknown type name 'Super'; did you mean 'NonTemplate::Super'?
using B = typename Super;
// error: expected a qualified name after 'typename'
using C = Inherit::Super;
// error: 'Inherit' is not a class, namespace, or enumeration
using D = typename Inherit<Template<T>, SomeBase>::Super;
// compiles, but what's the point?
};
int main() {
return 0;
}
如果我並不需要New
參數我也能使用Inherit
使用模板,但我真的需要New
。我可以通過使用選項D
來編譯代碼,但這會破壞整個目的。
我有兩個問題:
- 究竟是語言問題,防止被稱爲類
Template
內部和類型名稱Super
這是爲什麼不同的NonTemplate
情況? - 沒有人有很好的解決了這個問題的想法?
根據名稱...'繼承,SomeBase>'可能有一些專業化可能會改變Super'的'的意思。 – Jarod42