关于c ++:模板类中受保护的模板成员函数

Protected template member functions in a template class

本问题已经有最佳答案,请猛点这里访问。

假设我们有

1
2
3
4
5
6
7
8
9
10
11
12
template<typename T>
class Base
{
    ...

    protected:

        template<typename U>
        void compute(U x);

    ...
};

现在我想从派生类调用这个方法。对于非模板成员函数,我通常使用using ...声明或使用this->...访问成员。但是,不清楚如何访问模板成员:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
template<typename T>
class Derived : public Base<T>
{
    // what's the correct syntax for
    // using ... template ... Base<T>::compute<U> ... ?

    ...

    void computeFloat()
    {
        float x = ...;
        compute<float>(x);
    }

    void computeDouble()
    {
        double x = ...;
        compute<double>(x);
    }

    ...
};

更容易。你可以写:

1
2
3
4
void computeFloat() {
    float x = .1;
    this->compute(x);
}

类型是自动推断的。

编辑

对于一般情况,当无法推导类型时,可以使用以下任一项:

1
Base<T>::template compute<float>();

或:

1
this->template compute<float>();

对于示例,我使用了一个没有参数的compute函数。