我有一个这样声明的结构:
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 */
}
关于c++ - 努力使用模板化结构选择类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36840423/