繁体   English   中英

如何使用模板template参数显式实例化函数

[英]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可以解决此问题,其中Xstd::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM