我有两个类,一个继承自另一个:
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();
}
但是,这似乎是在提示“BB
时)。
有什么想法吗?在这种情况下,这是正确的方法吗?还有其他更适合的方法吗?
注意:这是一个简化的情况。在同一类型 B
上对 A
进行模板化只会让 A
有很多模板参数,我不希望这样。
最佳答案
当时A<B<TT>>
被实例化,B<TT>
仍然是一个不完整的类,所以你不能使用 B<TT>::tt
.
如果问题类型是 B
的模板参数,然后您可以通过特征类提取模板参数:
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();
};
Demo .
关于c++ - 基于继承类模板更改基类成员的类型签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28577609/