我有一个结构,我
声明如下: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
.事实是我从来没有这样做过,我不知道我应该如何使用这个结构。谁能帮我解决这个问题?
这里有一些问题。您声明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 */
}
template <typename T, typename U>
smu::Matrix<typename select<T, U>::type> operator*(
const smu::Matrix<T>& a, const smu::Matrix<U>& b)