我有两个类,一个继承自另一个:

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/

10-14 11:33