我正在尝试学习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)
这里有什么问题?
谢谢。
答案 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; });
没有添加重复。