没有匹配函数调用const char *的模板特化

时间:2016-08-03 17:18:23

标签: c++ templates c++11

我正在尝试学习C ++语言的模板专业化,遇到这种情况我无法解决。代码如下:

#include <vector>
#include <iostream>
#include <string>
#include <cmath>

using namespace std;
size_t count(const vector<string> &, const char* const &);

template <typename T>
size_t count(const vector<T>& v, const T& find) {
  size_t c = 0;
  for (auto ele : v) {
    if (ele == find)
      ++c;
  }
  return c;
}

template <>
size_t count(const vector<double> &v, const double &find) {
  size_t c = 0;
  for (auto ele : v) {
    if (abs(ele - find) < 0.0001)
      ++c;
  }
  return c;
}

template <>
size_t count(const vector<const char*> &v, const char* const &find) {
  size_t c = 0;
  for (auto ele : v) {
    if (strcmp(ele, find) == 0)
      ++c;
  }
  return c;
}

size_t count(const vector<string> &v, const char* const &find) {
  size_t c = 0;
  for (auto ele : v) {
    if (strcmp(ele.c_str(), find) == 0)
      ++c;
  }
  return c;
}

int main() {
  vector<double> vd{0.1, 0.1, 0.2};
  cout << count(vd, 0.1) << endl;
  vector<string> vs{"I", "you", "I"};
  cout << count(vs, "I") << endl;
  vector<const char*> vc{"I", "you", "I"};
  cout << count(vc, "I") << endl;
  return 0;
}

编译此代码时,cout << count(vc, "I") << endl;将报告有关未找到匹配函数调用的错误。

但是,我故意声明这个函数调用的特化,即template <> size_t count(const vector<const char*> &v, const char* const &find)

这里有什么问题?

谢谢。

1 个答案:

答案 0 :(得分:2)

专业化的工作方式是:首先针对主要模板进行演绎,然后考虑任何专业化。当您致电count(vc, "I")时,我们会在

上执行扣减
template <typename T>
size_t count(const vector<T>& v, const T& find)

会为第一个const char*推断T,但为第二个char[2]推导T。由于那些不匹配,扣除失败。你的专业是什么并不重要(无论如何,出于同样的原因,这是错误的)。

不是在两个地方专门化和使用相同的T,而是提供两个重载:

template <class Container, class ELem>
size_t count(Container const& c, Elem const& elem); // uses operator==

template <class Container, class UnaryPredicate>
size_t count(Container const& c, UnaryPredicate f); // uses f()

这样,你可以写:

count(vd, [](double d){return abs(d-0.1) < 0.00001;});
count(vc, [](const char* p){ return strcmp(p, "I") == 0; });

没有添加重复。