我有以下课程:
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
}
};
这有什么问题?如何避免此错误?
答案 0 :(得分:4)
using
is a type alias。 getPercentage
不是一个类型,它是一个函数。你不能使用别名。
形成你的意图,转发功能会更合适。
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);
}
};