如何使用模板参数显式实例化函数 我有一个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; }

如何使用模板参数显式实例化函数 我有一个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; },c++,templates,C++,Templates,我无法显式地实例化它。我尝试了以下大多数排列: template double func<double, X>(std::deque<Meas<double>>::const_iterator, std::deque<Meas<double>>::const_iterator); 其中X为以下之一: std::deque template std::deque temp

我无法显式地实例化它。我尝试了以下大多数排列:

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是一个带有默认第二个参数的templateclass,而不是templateclass。所以它不符合条件

有时模板类容器可以解决这个问题,X是std::deque

在您的简化示例中,容器没有任何有用的用途。您只需要迭代器值类型。很有可能这种无意义的情况仍然存在于实际代码中,因为想要一个迭代器来自的容器并不是std库的容器/迭代器设计的方式。你不应该在意

使用T=typename std::iterator\u traits::value\u 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::allocator,它与func的模板参数声明不匹配。您可以将模板类容器更改为模板类容器,或者使用类似于模板类容器的方法,这允许使用任意数量的模板参数

第二个是func采用container::const_iterator类型的参数,这与显式实例化(即std::deque::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);

这个改变是有效的。谢谢使用容器的意义在于,在编写函数时,开发环境知道迭代器值类型,因此它可以在您键入时执行所有成员检查和智能变量完成。另外,如果我们期望这里的值类型是某种特定的东西,那么允许它是任何东西似乎都是一种奇怪的方案。我之前的问题中有一个输入错误,现在已经修复了:实例化中std::deque的模板参数是错误的。这似乎造成了混乱。