【发布时间】:2012-09-22 02:37:29
【问题描述】:
我仍在努力重载 Sum 函数,该函数可以与向量/列表或映射一起使用。我的 sum 函数的向量/列表版本工作正常,我认为我的地图版本代码相当不错,但是当我测试它时,编译器似乎认为我正在尝试调用函数的列表/向量版本,并引发一些编译器错误。相关代码如下:
template <typename T>
const double Sum(typename T start_iter, typename T end_iter)
{// code...
}
template <typename T>
const double Sum(map<typename T, double> start_iter, map<typename T, double> end_iter)
{// different code...
}
int main()
{
map<string, double> test_map; // construct empty map
test_map["Line1"] = 10; // add some data
test_map["Line2"] = 15;
Sum(test_map.begin(),test_map.end()) // this tries to call the list/vector version of sum
}
我如何混淆这些功能?谢谢!
【问题讨论】:
-
首先,您在第二个声明中缺少两个
::iterators。map<typename T, double>中的typename也是不必要的。其次,在map<T, double>::iterator中,T处于不可演绎的上下文中,所以你不走运。您可以根据std::iterator<Iter>::value_type是否为pair来尝试重载。 -
那么,应该更像这样吧?
const double Sum<map<T,double>>(map<typename T, double>::iterator start_iter, map<typename T, double>::iterator end_iter) -
@Clark:是的,但也要注意avakar关于推导T的说法。如果您将函数称为
Sum(test_map.begin(),test_map.end()),则编译器无法通过模板参数推导得出T应该成为string。你可以称它为Sum<string>(test_map.begin(),test_map.end())。 -
无论您如何编写它,它都不会起作用,因为编译器将无法通过匹配
map<T, double>::iterator和map<string, double>::iterator来推断T是string。这就是不可演绎上下文的含义。 -
原因,顺便说一句,标准中没有说明
map<string,double>::iterator是否与something_else::iterator是同一类型。iterator只是一个类中的 typedef,它是一个类型的 name。模板参数推导适用于传递的类型,而不是它们的名称。 “在某个类中显示为 typedef”不是标准关注的类型的属性。
标签: c++ templates stl map overloading