我如何为静态模板方法添加别名?

时间:2016-02-12 08:14:42

标签: c++ c++11

我有以下课程:

struct A
{
    template<typename T1, typename T2>
    static double constexpr getPercentage(const T1 t1, const T2 t2)
    {
        return 100.0 * static_cast<double>(t1) / static_cast<double>(t2);
    }
};

我有别名并使用A::getPercentage B,如下所示:

struct B
{
    template<typename T1, typename T2>
    using getPercentage = decltype(A::getPercentage<T1, T2>);

    void f()
    {
        const double d = getPercentage(1.0, 2.0); //ERROR: Cannot refer to class template 'getPercentage' without a template argument list
    }
};

这有什么问题?如何避免此错误?

2 个答案:

答案 0 :(得分:4)

using is a type aliasgetPercentage不是一个类型,它是一个函数。你不能使用别名。

形成你的意图,转发功能会更合适。

template <typename T1, typename T2>
double constexpr getPercentage(T1&& t1, T2&& t2)
{
    return A::getPercentage(std::forward<T1>(t1), std::forward<T2>(t2));
}

完整列表;

struct A
{
    template<typename T1, typename T2>
    static double constexpr getPercentage(const T1 t1, const T2 t2)
    {
        return 100.0 * static_cast<double>(t1) / static_cast<double>(t2);
    }
};

struct B
{
    template <typename T1, typename T2>
    static constexpr double getPercentage(T1&& t1, T2&& t2)
    {
        return A::getPercentage(std::forward<T1>(t1), std::forward<T2>(t2));
    }

    void f()
    {
        const double d = getPercentage(1.0, 2.0);
    }
};

答案 1 :(得分:2)

您不能使用别名功能。您的getPercentage别名是A::getPercentage类型的别名。

您可以添加转发功能,而不是别名A::getPercentage

struct B
{
    //forwarding function
    template<typename T1, typename T2>
    static double constexpr getPercentage(const T1 t1, const T2 t2) 
    {
        return A::getPercentage(t1,t2);    
    }

    void f()
    {
        //calls B::getPercentage, which calls A::getPercentage
        const double d = getPercentage(1.0, 2.0); 
    }
};