通过派生类模板参数指定基类模板参数之一。如何使用基类的using声明

时间:2019-05-30 12:40:08

标签: c++ templates

例如,我有下一个代码:

template<typename T, typename T2>
class a
{
public:
    using myfl_t = float;

    a(myfl_t fl, double db) {}

    virtual void f()
    {
        std::cout << "a::f()\n";
    }
};

template<typename T>
class b : public a<T, int>
{
    using base_t = a<T, int>;
    using myfl_t = typename base_t::myfl_t;
public:
    b(myfl_t fl, double db)
        : base_t(fl, db) {}

    void f() override
    {
        std::cout << "b::f()\n";
    }
};

似乎我只能通过在派生类中复制use来重用基类的myfl_t声明。 有更简单的方法吗?

2 个答案:

答案 0 :(得分:1)

如以下所述,在myflt_t中定义的

class aclass b中不可见:https://eli.thegreenplace.net/2012/02/06/dependent-name-lookup-for-c-templates

您可以将myflt_t带入class b,而无需进行明确的重新声明:

using typename base_t::myfl_t

答案 1 :(得分:0)

您可以将using放到b中,并在构造函数中使用它:

b(typename a<T, int>::myfl_t fl, double db)

无论如何,您的当前代码对我来说似乎还不错。您实际上并没有在此处复制任何内容。如果需要再次指定float,则可以进行复制,在这里不是这种情况,所以可以。

请参阅以下原因:

Why is the keyword "typename" needed before qualified dependent names, and not before qualified independent names?