[英]How do you explicitly instantiate a function with a template template parameter
我有形式的C ++函数(有点复杂;这是MWE):
template <typename T>
struct Meas {
T time;
T value;
};
template <typename T, template <typename U> class container>
T func(typename container<Meas<T>>::const_iterator start,
typename container<Meas<T>>::const_iterator end)
{
T c = 0;
while (start != end) {
c += start->value;
}
return c;
}
我在显式实例化它时遇到了麻烦。 我尝试了以下大多数排列方式:
template double func<double, X>(std::deque<Meas<double>>::const_iterator,
std::deque<Meas<double>>::const_iterator);
X为以下之一:
std::deque
template std::deque
template std::deque<double>
std::deque<double>
template <typename U> std::deque<U>
template <typename U> std::deque
但它们都不能在Xcode 9.0中编译。 最常见的错误是:
“ func”的显式实例化不引用函数模板,变量模板,成员函数,成员类或静态数据成员
我应该如何正确地显式实例化此函数?
std::deque
是具有默认第二个参数的template<class, class>class
,而不是template<class>class
。 因此它不符合条件。
有时template <class...> class container
可以解决此问题,其中X
为std::deque
。
在您的简化示例中, container
没有任何用处。 您只需要迭代器值类型。 奇怪的是,这种毫无意义的事情仍然存在于您的实际代码中,因为想要迭代器所来自的容器不是std库的容器/迭代器设计的设计方式。 你不在乎
使用using T=typename std::iterator_traits<Iterator>::value_type;
从迭代器类型而不是您在做什么中提取T
template <class It, class T=typename std::iterator_traits<It>::value_type>
T func(It start, It end)
{
T c = 0;
while (start != end) {
c += start->value;
++start;
}
return c;
}
这可以推导其模板参数,就像99%的好的模板函数一样。
然后,如果您需要实例化它:
template double func<std::deque<double>::const_iterator, double>(std::deque<double>::const_iterator,
std::deque<double>::const_iterator);
可能不需要,double
,我的内置编译器是不确定的,我也不用检查它。
有两个问题,第一个是std :: deque有两个模板参数(第二个是默认值std::allocator<T>
),这与func
的模板模板参数声明不匹配。 您可以将template <typename U> class container
更改为template <typename, typename> class container
或使用参数包,如template <typename...> class container
,该参数包允许任意数量的模板参数。
第二个问题是func
接受类型为container<Meas<T>>::const_iterator
参数,该参数与显式实例化中的类型不匹配(即std::deque<double>::const_iterator
)。
以下应该工作。
template <typename T, template <typename...> class container>
T func(typename container<Meas<T>>::const_iterator start,
typename container<Meas<T>>::const_iterator end)
{
...
}
template
double func<double, std::deque>(std::deque<Meas<double>>::const_iterator,
std::deque<Meas<double>>::const_iterator);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.