2014-12-13 78 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