我有两个类,一个继承自另一个类:
struct A {
(pure?) virtual tt returns_something();
}
template <typename T>
struct B : A {
virtual T returns_something();
}
如何使这项工作,returns_something()
具有正确的类型签名。
我认为这是一个奇怪的重复出现的模板模式的工作:
template <typename T>
struct A {
pure virtual typename T::tt returns_something();
}
template <typename TT>
struct B : A<B<TT>> {
typedef TT tt;
virtual tt returns_something();
}
然而,这似乎抱怨说&#34;没有名为&#39; tt&#39;在B&lt;漂浮&gt;&#34; (当我用TT作为浮动实例化B
时)。
有什么想法吗?在这种情况下,这是正确的方法吗?还有其他方法更适合吗?
注意:这是一种简化的情况。同一类型A
上的模板B
仅仅是因为A
有很多模板参数,我不想这样做。
答案 0 :(得分:2)
在实例化A<B<TT>>
时,B<TT>
仍然是一个不完整的类,因此您无法使用B<TT>::tt
。
如果有争议的类型是B
的模板参数,那么您可以通过traits类提取模板参数:
template <typename TT>
struct B;
template<class> struct B_traits;
template<class TT>
struct B_traits<B<TT>> {
using tt = TT;
};
template <typename T>
struct A {
virtual typename B_traits<T>::tt returns_something();
};