我有一个我声明的结构:
template <typename T, typename U> struct select_type;
我专注于:
template <> struct select_type<float, double>
{
typedef double type;
};
对于<double, float>
,<int, float>
......
我在一些模板化的函数中使用它,如:
template <typename T, typename U, typename select<T,U>::type R >
smu::Matrix<R> operator*(const smu::Matrix<T>& a, const smu::Matrix<U>& b)
{
/* code here */
}
我尝试了多种方式来使用它,没有R
,没有typename
但是大多数时候我有一个错误要求nested-name parameter before select
。事实是我从来没有这样做过,我不知道应该如何使用这种结构。任何人都可以帮我这个吗?
答案 0 :(得分:2)
这里有一些问题。您宣布R
的方式:
typename select<T,U>::type R
是select<T,U>::type
类型的值。这不是您想要的 - 您希望R
成为类型。其次,R
是一个非推导的上下文 - 它是一个模板参数,未在任何参数中指定,因此无法推断,只能明确指定。但是你无法真正明确地指定它,因为无论如何都会失去方便的operator*
。
在C ++ 11及更高版本中,您可以将其设为默认类型参数:
template <typename T, typename U, typename R = typename select<T,U>::type>
smu::Matrix<R> operator*(const smu::Matrix<T>& a, const smu::Matrix<U>& b)
但是在C ++ 03中,你不能拥有默认的函数模板参数,所以你只需写出来:
template <typename T, typename U>
smu::Matrix<typename select<T,U>::type> operator*(const smu::Matrix<T>& a,
const smu::Matrix<U>& b)
{
typedef typename select<T,U>::type R;
/* rest as before */
}
答案 1 :(得分:1)
template <typename T, typename U>
smu::Matrix<typename select<T, U>::type> operator*(
const smu::Matrix<T>& a, const smu::Matrix<U>& b)