我有两个类,一个继承自另一个:
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();
}
但是,这似乎抱怨“在B 中没有名为'tt'的类型”(当我使用TT作为浮点实例化
B
时)。有任何想法吗?在这种情况下,这是正确的方法吗?还有另一种更适合的方法吗?
注意:这是一种简化的情况。对具有相同类型
A
的模板B
进行模板化只是使A
具有许多模板参数,我不希望这样。 最佳答案
在实例化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();
};
Demo。
关于c++ - 根据继承的类模板更改基类成员的类型签名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28577609/