2014-12-13 45 views
0

我有这个没有提供模板而调用的模板化函数?

#include "Division_Euclidean_space.h" 

float find_diameter_exact(const int N, const int D, 
           const std::vector<float>& v) { 
    d = squared_Eucl_distance(v, offset, offset + D, i * D + D); 
    ... 
} 

,我其实是打算做一个模板方法,因为我的矢量是要支持任何数字数据类型。

所以,在头文件中包含我:

template<typename T> 
T squared_Eucl_distance(const std::vector<T> &p, size_t start1, 
           size_t end1, size_t start2) { 
    ... 
} 

不应该我得到一个错误,说我没有为squared_Eucl_distance()提供T


PS

滑稽相关pic

+6

'T'以外的第一个参数的东西从函数参数推断你会得到一个错误。 – juanchopanza 2014-12-13 17:14:20

+1

_“有趣的相关图片”_大多数时候我都很担心相反的方向;)... – 2014-12-13 17:16:50

+0

我猜juanchopanza,但我不确定! @πάνταῥεῖ我也是,但我不想写在我的答案,为了不成为“垃圾邮件”。 ; p – gsamaras 2014-12-13 17:24:51

回答

4

Template type deduction不是一个“简单”的事情,但你的情况很简单:当你通过一个std::vector<something>,编译器会从std::vector<T>推断T === something

你的功能是如此实例化为

something squared_Eucl_distance(const std::vector<something> &p, size_t start1, 
           size_t end1, size_t start2) 

无论something是。

如果传递的不是std::vector

+0

Bella risposta!我会尽快接受它。 Grazie :) //住在卢加诺一段时间 – gsamaras 2014-12-13 17:27:11

+0

哦,我有一个问题,模板类型扣除发生在编译时或运行时?是否更好(在发布的情况下)让扣款自动发生,还是我们应该自己选择? – gsamaras 2014-12-13 17:33:21

+0

@ g.samares编译时间。你应该引用一个'std :: vector const&'并且让'T'和'A'被推导出来。 – Yakk 2014-12-13 17:40:52